c++ 键盘 kbd.h 需要有关处理修饰键状态的更多信息

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

我开始使用 kbd.h 在 Windows 上处理键盘布局。我通过 kbdxx.dll 了解了 scancode->keycode 部分,但在处理修饰键(shift、Ctrl、Alt)方面遇到了困难,尤其是这些键状态的二进制编码如何与键码一起使用。

由于 kbd.h 中的描述对我没有帮助,我正在寻找更多关于此的文献。

在哪里可以找到有关键盘的更多信息,尤其是修改键所在的部分?

c++ keycode keyboard-layout scancodes modifier-key
2个回答
0
投票

除了 SDK 中的

kbd.h
示例键盘布局之外,没有关于键盘布局格式的官方文档。

这些结构和标志有一些非官方的描述: https://github.com/lelegard/winkbdlayouts


0
投票

您需要更具体地说明布局的哪一部分有问题。键盘布局 DLL 中的表用于描述如何执行以下任务:

  • 将(本质上是10位)扫描码转换为虚拟代码(通常通过3个静态表,用于“前缀”
    x00
    xE0
    0xE1
    ;但它也可以使其在
    Shift/Alt/Ctrl
    上可变-修饰符,在一定程度上)。
  • 将扫描码转换为键名。
  • 将按键的状态转换为“16 个‘修饰符位’的当前位图”。
  • 将当前位图转换为布局表中列的序号。
  • 将当前按下的键的
    VK_
    名称和当前列号转换为“事件”:
    NOP
    ,或 UTF-16 代码点,或键盘 FSM1⁾ 的状态号,或“查找长串事件”。
  • 如果 FSM 不处于基本状态:将当前按下的键的“分配的 UTF-16 代码点”(或“分配的状态 ID”,或长字符串中后续的 UTF-16 代码点)转换为新状态FSM,或一个 UTF-16 代码点发射。
  • 对于“长字符串事件”的情况,将当前按下的键的
    VK_
    名称和当前列号转换为UTF-16代码点序列。

¹⁾ 这种有限状态机的功能非常有限。

我怀疑你只需要看看例子。琐碎的文件将由 MSKLC 生成(如果需要,使用其

kbdutool
将 UI 创建的
.klc
文件转换为 C)。其他重要的例子可能是
这个源代码分发
 中的C文件(从ooo-us等翻译而来)—— 我试图在C文件中添加尽可能多的注释。

有关“比真正的初学者想要看到的更多信息”,请参阅我的文档

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