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