macOS上的Cocoa/Objective-C-通过按键处理重音字符:
我有一个通过keyDown处理击键的应用程序:。到目前为止,除了两个问题(另一个是)外,这一切都很好 这个问题的问题是关于重音字符,即与死字符相结合的字母,例如a 我正在处理keyDown:到目前为止还不错(通过[nsevent characters]访问字符)。只是我从来没有得到口音的字符 我得到了一个keyDown:accent事件,其中[nsevent characters]的长度为零,但本质上我想我不知道如何处理它 keyDown:中的下一个字符是非重音版本,例如an/a/ 我也知道selectNextKeyView:但理想情况下,我正在寻找一种方法,让系统将组合传递给keyDown:进行正常处理(顺便说一句,keyUp:被正确调用) 所以本质上我的问题是:为什么我的handleKeyEvent:从来没有通过[nsevent characters]得到一个a,只有一个a/ 或者我应该如何访问这些字符macOS上的Cocoa/Objective-C-通过按键处理重音字符:,objective-c,macos,cocoa,keyboard,Objective C,Macos,Cocoa,Keyboard,我有一个通过keyDown处理击键的应用程序:。到目前为止,除了两个问题(另一个是)外,这一切都很好 这个问题的问题是关于重音字符,即与死字符相结合的字母,例如a 我正在处理keyDown:到目前为止还不错(通过[nsevent characters]访问字符)。只是我从来没有得到口音的字符 我得到了一个keyDown:accent事件,其中[nsevent characters]的长度为零,但本质上我想我不知道如何处理它 keyDown:中的下一个字符是非重音版本,例如an/a/ 我也知道se
-(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;
}
看一看谢谢你这是一个巨大的帮助。让我补充一点,您需要包括“Carbon/Carbon.h”和“CoreServices/CoreServices.h”,并链接到Carbon.framework以实现此功能。您好,关于如何在按键功能中获取重音字符的任何建议,前提是用户按下一个键并按住以显示重音字符覆盖,然后选择其中一个重音字符。