Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
macOS上的Cocoa/Objective-C-通过按键处理重音字符:_Objective C_Macos_Cocoa_Keyboard - Fatal编程技术网

macOS上的Cocoa/Objective-C-通过按键处理重音字符:

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

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

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

我正在处理keyDown:到目前为止还不错(通过[nsevent characters]访问字符)。只是我从来没有得到口音的字符

我得到了一个keyDown:accent事件,其中[nsevent characters]的长度为零,但本质上我想我不知道如何处理它

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

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

所以本质上我的问题是:为什么我的handleKeyEvent:从来没有通过[nsevent characters]得到一个a,只有一个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;
}

看一看谢谢你这是一个巨大的帮助。让我补充一点,您需要包括“Carbon/Carbon.h”和“CoreServices/CoreServices.h”,并链接到Carbon.framework以实现此功能。您好,关于如何在按键功能中获取重音字符的任何建议,前提是用户按下一个键并按住以显示重音字符覆盖,然后选择其中一个重音字符。