gpt4 book ai didi

objective-c - macOS 上的 Cocoa/Objective-C - 通过 keyDown 处理重音字符 :

转载 作者:行者123 更新时间:2023-12-03 17:01:39 25 4
gpt4 key购买 nike

我有一个通过 keyDown: 处理击键的应用程序。到目前为止,除了两个问题之外,效果很好(另一个是 here )。

这个问题的问题是关于重音字符,即与死字符组合的字母,例如á

我正在处理 keyDown: 到目前为止一切正常(通过 [nsevent 字符] 访问字符)。只是我从来没有遇到过带重音的字符。

我得到一个 keyDown: 重音 ´ 事件,其中 [nsevent 字符] 的长度为零,但本质上我想我不知道如何处理它。

keyDown: 中的下一个字符是非重音版本,例如一个/a/。

我也了解 selectNextKeyView: 但理想情况下,我正在寻找一种方法让系统将组合传递给 keyDown: 进行正常处理(顺便说一句 keyUp: 被正确调用)。

所以本质上我的问题是:为什么我的handleKeyEvent:从来没有通过[nsevent字符]得到一个á,只有一个/a/?

或者我应该如何访问这些字符?

        -(void)keyDown:(NSEvent *)nsevent
{
BOOL didit= [self handleKeyEvent:nsevent isRaw:FALSE isUp:FALSE];
if (!didit)
[super keyDown:nsevent];
}


-(void)keyUp:(NSEvent *)nsevent
{
BOOL didit= [self handleKeyEvent:nsevent isRaw:FALSE isUp:TRUE];
if (!didit)
[super keyUp:nsevent];
}

最佳答案

回答我自己的问题。

感谢已经回答的问题(请参阅代码顶部附近的两个链接),我可以通过 unicode 例程 UCKeyTranslate() 解决这个问题。

下面的函数需要一个持久的 UInt32 来跨调用存储 deadKeyState,但仅此而已。

//-------------------------------------------------------------------------
// translate keyDown to true unichar via inputlayout
//-------------------------------------------------------------------------
NSString *
translateInputForKeyDown(NSEvent *event, UInt32 *deadKeyState) const
{
// http://stackoverflow.com/questions/12547007/convert-key-code-into-key-equivalent-string
// http://stackoverflow.com/questions/8263618/convert-virtual-key-code-to-unicode-string

const size_t unicodeStringLength = 4;
UniChar unicodeString[unicodeStringLength]= { 0, };
UniCharCount reallength= 0;
NSString *nsstring= nil;

TISInputSourceRef fkis= TISCopyCurrentKeyboardInputSource();
if (fkis) {
CFDataRef cflayoutdata= (CFDataRef)TISGetInputSourceProperty(fkis, kTISPropertyUnicodeKeyLayoutData);
const UCKeyboardLayout *keyboardlayout= (const UCKeyboardLayout *)CFDataGetBytePtr(cflayoutdata);
CGEventFlags flags = [event modifierFlags];
UInt32 keymodifiers = (flags >> 16) & 0xFF;

UCKeyTranslate(keyboardlayout,
[event keyCode], kUCKeyActionDown, keymodifiers,
LMGetKbdType(), 0,
deadKeyState,
unicodeStringLength, &reallength, unicodeString);
::CFRelease(fkis);
}


if (reallength>0) {
nsstring= (NSString *)CFStringCreateWithCharacters(kCFAllocatorDefault, unicodeString, reallength);
}

return nsstring;
}

关于objective-c - macOS 上的 Cocoa/Objective-C - 通过 keyDown 处理重音字符 :,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40088837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com