我正在编写一个虚拟键盘应用程序,它读取 Windows KBD 文件来构建键盘。我无法理解如何解释为每个虚拟键返回的字符数组。
我在这个 CodePlex 项目中使用 kbd.h 文件。
这是我不理解的结构。
typedef struct {
PVK_TO_BIT pVkToBit; // Virtual Keys -> Mod bits
WORD wMaxModBits; // max Modification bit combination value
BYTE ModNumber[]; // Mod bits -> Modification Number
} MODIFIERS, *KBD_LONG_POINTER PMODIFIERS;
在阅读文档并使用美式键盘分析结果时,此结构及其包含的数据是有意义的。
---------------
US
---------------
CharModifiers
0001 = SHIFT
0010 = CTRL
0100 = ALT
ModNumber
0000 = 0 = BASE
0001 = 1 = SHIFT
0010 = 2 = CTRL
0011 = 3 = SHIFT + CTRL
这就是说,对于为每个虚拟键(另一个 kbd.h 结构)返回的字符数组,第一个表示没有修饰符,第二个表示SHIFT
保存时的值,依此类推。这是准确的,并且完美地映射到为每个虚拟键返回的字符数组。
但是,如果我加载德语键盘布局 (KBDGR.dll),则 PMODIFIERS 不会与为每个虚拟键返回的字符数组对齐。
---------------
German
---------------
CharModifiers
0001 = SHIFT
0010 = CTRL
0100 = ALT
ModNumber
0000 = 0 = BASE = REALLY BASE
0001 = 1 = SHIFT = REALLY SHIFT
0011 = 3 = SHIFT + CTRL = REALLY ALTGR
0100 = 4 = ALT = REALLY CTRL
1111 = 15 = INVALID = INVALID
1111 = 15 = INVALID = INVALID
0010 = 2 = CTRL = REALLY SHIFT + CTRL
0101 = 5 = SHIFT + ALT = REALLY SHIFT + ALTGR
正如您在此处看到的,例如,0010 应该只与CTRL
修饰符相关,但是,从虚拟键返回的字符实际上代表SHIFT + CTRL
.
我不明白什么?我认为 ModNumber 数组描述了每个虚拟键的每个字符索引,以及它们代表的修饰键。这种假设适用于美国键盘布局,但何时不适用于德国键盘布局?