Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.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 将虚拟密钥代码转换为unicode字符串_Macos_Cocoa_Localization_Keyboard_Macos Carbon - Fatal编程技术网

Macos 将虚拟密钥代码转换为unicode字符串

Macos 将虚拟密钥代码转换为unicode字符串,macos,cocoa,localization,keyboard,macos-carbon,Macos,Cocoa,Localization,Keyboard,Macos Carbon,我使用了一些代码来获取当前键盘布局,并将虚拟键代码转换为字符串。这在大多数情况下都很有效,但在某些特定情况下我遇到了麻烦。德国QWERTZ键盘上退格键旁边的重音键就是这一点的关键所在 该键生成我期望的VK代码kVK_ANSI_Equal,但当使用QWERTZ键盘布局时,我没有得到任何描述。它最终成为一个死键,因为它应该是由另一个键组成的。有没有办法抓住这些案例并进行适当的转换 我现在的代码如下 TISInputSourceRef currentKeyboard = TISCopyCurrentK

我使用了一些代码来获取当前键盘布局,并将虚拟键代码转换为字符串。这在大多数情况下都很有效,但在某些特定情况下我遇到了麻烦。德国QWERTZ键盘上退格键旁边的重音键就是这一点的关键所在

该键生成我期望的VK代码
kVK_ANSI_Equal
,但当使用QWERTZ键盘布局时,我没有得到任何描述。它最终成为一个死键,因为它应该是由另一个键组成的。有没有办法抓住这些案例并进行适当的转换

我现在的代码如下

TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource();
CFDataRef uchr = (CFDataRef)TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData);
const UCKeyboardLayout *keyboardLayout = (const UCKeyboardLayout*)CFDataGetBytePtr(uchr);

if(keyboardLayout)
{
    UInt32 deadKeyState = 0;
    UniCharCount maxStringLength = 255;
    UniCharCount actualStringLength = 0;
    UniChar unicodeString[maxStringLength];

    OSStatus status = UCKeyTranslate(keyboardLayout,
                                     keyCode, kUCKeyActionDown, 0,
                                     LMGetKbdType(), kUCKeyTranslateNoDeadKeysBit,
                                     &deadKeyState,
                                     maxStringLength,
                                     &actualStringLength, unicodeString);

    if(actualStringLength > 0 && status == noErr)
        return [[NSString stringWithCharacters:unicodeString length:(NSInteger)actualStringLength] uppercaseString];
}
该键是一个死键,如果您自己尝试,或者在德语布局处于活动状态时查看键盘查看器,您可以看到这一点

在Mac电脑上,在不使用其他字符组合的情况下,输入死键的实际字符的方法是在死键后按空格。因此,请尝试以下操作:关闭
kUCKeyTranslateNoDeadKeysBit
,如果
uckeytranlate
设置了死键状态,请在死键状态后转换一个空格

编辑(由asker添加)

只为未来的人们,这里是固定的代码与正确的解决方案

TISInputSourceRef currentKeyboard = TISCopyCurrentKeyboardInputSource();
CFDataRef uchr = (CFDataRef)TISGetInputSourceProperty(currentKeyboard, kTISPropertyUnicodeKeyLayoutData);
const UCKeyboardLayout *keyboardLayout = (const UCKeyboardLayout*)CFDataGetBytePtr(uchr);

if(keyboardLayout)
{
    UInt32 deadKeyState = 0;
    UniCharCount maxStringLength = 255;
    UniCharCount actualStringLength = 0;
    UniChar unicodeString[maxStringLength];

    OSStatus status = UCKeyTranslate(keyboardLayout,
                                     keyCode, kUCKeyActionDown, 0,
                                     LMGetKbdType(), 0,
                                     &deadKeyState,
                                     maxStringLength,
                                     &actualStringLength, unicodeString);

    if (actualStringLength == 0 && deadKeyState)
    {
        status = UCKeyTranslate(keyboardLayout,
                                         kVK_Space, kUCKeyActionDown, 0,
                                         LMGetKbdType(), 0,
                                         &deadKeyState,
                                         maxStringLength,
                                         &actualStringLength, unicodeString);   
    }
    if(actualStringLength > 0 && status == noErr)
        return [[NSString stringWithCharacters:unicodeString length:(NSUInteger)actualStringLength] uppercaseString];
}

此代码用于密钥绑定转换。因此,在这个上下文中,该键在正常键入之外是可用的。我在HID级别获取它,但我需要一种方法来向用户显示绑定了什么密钥。对于QWERTZ布局,我如何判断虚拟钥匙就是钥匙帽?这是固定代码,非常感谢彼得,@Joshuawinberg:我更正了你添加到我答案中的代码;您将长度强制转换为错误的类型。注意:在最初的帖子中,KuckeyTranslateNoDeadKeyBit没有首先打开,因为它使用不正确。传递kUCKeyTranslateNoDeadKeysBit与传递0之间没有区别,因为前者定义为0。位设置的实际掩码是KuckeyTranslateNodeAddKeysMask。非常棒。谢谢你,彼得!您是否应该设置KuckeyTranslateNodeKeysMask而不是KuckeyTranslateNodeKeysBit,因为后者定义为0,而前者是实际启用该位的掩码?