1

我正在编写一个虚拟键盘应用程序,它读取 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 数组描述了每个虚拟键的每个字符索引,以及它们代表的修饰键。这种假设适用于美国键盘布局,但何时不适用于德国键盘布局?

4

2 回答 2

1

我通过电子邮件向KbdEdit的制造商发送了他们的意见,他们只是回复了答案!

ModNumber 数组中从零开始的位置定义了修饰符组合:例如,最后一个元素“2”在位置 6,其二进制表示为 110,即 KBDCTRL | KBDALT,即 AltGr (www.kbdedit.com/manual/low_level_modifiers.html#AltGr) 值“2”表示 AltGr 映射将出现在所有 aVkToWchX[] 数组中的索引 2 处(对于 X>=3)。

位置 3 对应于 Shift+Ctrl (= 011 = KBDSHIFT | KBDCTRL) - 你看到这个组合可以在 aVkToWchX[4] 找到(对于 X>=5)

如果您在 KbdEdit 中打开德语布局,您会看到 AltGr 确实位于位置 2,而 Shift+Ctrl 位于位置 4(从零开始) - 请参见随附的屏幕截图。

希望这可以帮助。

问候, 伊维卡

谢谢伊维卡!

于 2014-03-10T04:49:58.280 回答
0

我也从来没有弄清楚这一点 :) kbd.h 文件中的描述也没有多大意义,所以我没有费心去理解它。

在 kbd.h-header 中它指出:

* 控制菜单切换
* ^ ^ ^
* aModification[] = { | | |
* 0, // 0 0 0 = 000(无)

我相信修饰符应该是:
001 = SHIFT
010 = ALT
100 = CTRL

我同意该列表在德语中似乎不合逻辑,因此我复制了它。

但我主要致力于弄清楚扫描码(物理位置)和虚拟键之间的联系。每个虚拟键都包含修饰符,这样您就可以在所有修饰符组合之间进行迭代。

由于我是挪威人,我首先处理了 KBDNO.dll,并将其与 MKLC 进行比较:http: //msdn.microsoft.com/en-us/goglobal/bb964665.aspx

既然你要德语键盘,我也比较了它,它似乎匹配。和美国一样。

在我的网站上查看我的“虚拟键盘”:http: //lars.werner.no/ ?page_id=922

CKLL 课程可以帮助您实现您想要做的事情。这门课并不完美,所以你必须花几个小时才能到达那里。将键盘视为带有基于修饰符的附加虚拟键的扫描码数组:)

很抱歉没有对 atm 更有帮助,但我已经有一段时间没有编程了。我的爱好很少有空闲时间!

于 2014-03-03T22:31:44.113 回答