ToUnicodeEx 用零填充缓冲区并返回 1

问题描述 投票:0回答:2

我使用ToUnicodeEx函数将扫描码和虚拟键码转换为Unicode字符。在大多数情况下,它的工作原理如文档中所述。但在某些键盘布局中的某些键上,ToUnicodeEx 用零填充缓冲区但返回 1。根据 MSDN,这意味着将一个字符写入缓冲区。但缓冲区中的第一个值包含 0。我应该如何解释这些值组合?

我在以下情况下发现了这种行为:

  • 阿拉伯语 (102) (00010401) 扫描码:0x1f,虚拟键:0x53 'S',按下 Shift,未按下其他修饰符。
  • 因纽特语 - 拉丁语 (0000085d) 扫描码:0x1b,虚拟键:0xdd VK_OEM_6,按下 Shift,CapsLock 开启,未按下其他修饰键。

Microsoft Keyboard Layout Creator 加载这些布局时不会出现错误。在阿拉伯语 (102) 上,有问题的键为空。在因纽特语上 - 有问题的拉丁布局键包含大括号字符“}”。

我不明白,键盘布局创建器如何读取这个字符。

windows winapi keyboard keyboard-layout
2个回答
0
投票

看起来合法。 Key 在此布局/状态下为键生成

U+0000 Null
字符。你可以跳过它。

我认为如果这些键定义为

WCH_NONE
那么
ToUnicode
将返回 0。

https://learn.microsoft.com/globalization/keyboards/kbda2

http://kbdlayout.info/kbda2

https://learn.microsoft.com/globalization/keyboards/kbdiulat

http://kbdlayout.info/kbdiulat

“因纽特语 - 拉丁语”的特殊之处在于它使用

SGCAPS
功能:

某些键盘不会将所有击键的 CapsLock 和 Shift 键关联在一起;相反,按 CapsLock 键可为特定键定义额外的两个转换状态。因此,某些语言如果没有 CapsLock 键就无法键入。名称中的“SG”源自使用该功能的第一个键盘布局,即瑞士德语键盘布局。

请参阅 http://kbdlayout.info/features/SGCAPS 了解更多信息。


0
投票

这是MSKLC中的一个错误,它不会更频繁地产生此类事件。比如说,在“英语(美国)”键盘上,此类事件是通过按下

Ctrl-2
Ctrl-Shift-2
按键产生的。这种“有趣的键”的(几乎)完整列表位于文档的这一部分(此列表遗漏了
Ctrl-2
 — 我在我的副本中修复了它)。

(使用这些绑定,可以将任何

ASCII
代码点传递给应用程序。)

© www.soinside.com 2019 - 2024. All rights reserved.