1 回答
我不知道你是否还需要这个,因为我已经写了大部分我发布了。
我研究了一段时间,我还没有找到一个真正明确的答案,但我可以给你一些提示(尽管如此,我还是把这个作为答案发布,因为使用评论太笨拙了)。
我有一种强烈的感觉,你问的是不可能的(当按下诸如 ctrl 之类的修饰符时,诸如箭头之类的控制键无法映射到不同的键/字符/功能)。
我在这些事情上并不是真正的专家,但我可以给你一些建议:
(下面有很多与您的问题没有太大关系的信息,但它可能会帮助您更好地理解)
当您在 Windows 中按下一个键时,至少涉及 3 组代码:
- 扫码:这些是硬件实际生成并发送到电脑的代码。我对它们知之甚少,我从来不需要使用它们,而且当它们更相关时我还太年轻。从理论上讲,它们可能因键盘而异,但它们在很大程度上是标准化的;据我所知, USB 键盘确实是标准化的,它们的扫描码应该是这些HID 使用表(第 10 节)中列出的那些。维基百科有一些信息,但没有完整的传统代码列表。不过,很可能你不需要这些(但也许你会)。顺便说一下,这些扫描码是也传递给应用程序(我不确定可靠性如何),但他们几乎从未使用过它们。
- 虚拟键码: Windows 中的扫描码由键盘驱动程序转换为 Microsoft 指定的一组通用键码:虚拟键码。这些与键盘无关,并且是应用程序在需要处理单个按键时(通常)使用的。
- Unicode或其他字符集字符:当按下的键应该生成可打印字符时,Windows 会识别并将这些字符传递给应用程序。当应用程序只对可打印字符感兴趣时,它只查看这些字符,尽管当他们需要做更复杂的事情(快捷方式......)时,他们也可以访问虚拟键代码(并且,如果他们真的想要,给扫码)。Unicode 是一个字符集,而不是“键码集”,因此它通常只包含可打印的字符。为了促进与 ASCII 和其他遗留字符集的互操作性,它还包括以前标准中定义的控制字符,但在这些控制字符中,箭头键不存在,所以键盘的箭头没有 unicode 代码点。
在 klc 的第二列中,您似乎必须将虚拟键常量的名称
VK_
删除。确实很奇怪。几个 Microsoft 文档页面说,
kbd.h
您也可以在inc
Microsoft Keyboard Layout Creator 的目录中找到的 WDK 文件包含有关此内容的详细信息。不过,就我个人而言,我无法从中获得太多收益。如果你真的想深入研究这个,已故的 Michael Kaplan 的博客可能有你正在寻找的信息,在某个地方。
你最好的运气最有可能使用其他一些应用程序。我偶然发现了KbdEdit,它确实可以处理箭头键,但它确实似乎在与修饰符一起使用时无法为键分配不同的功能(但您可以完全更改键的效果,而与按下的修饰符无关)。
对于 Enter 键,您可能需要使用虚拟键,即
0D
(VK_RETURN
)。在 Windows 上用于指示换行符的字符序列是
CR
LF
,它们分别具有(在 Unicode 和几乎所有其他现有字符集中)代码点0D
0A
。
通知应用程序输入字符的 Windows 消息(上面第 1.3 点 -WM_CHAR
顺便说一下,我的意思是消息)虽然在您按 Enter 时只报告一个CR
( );0D
因此,如果这些 klf 文件在某些部分使用 unicode 代码点,则它们很有可能使用该 (CR
) 来指示 Enter 键。
总而言之,您最好的选择可能是将 Enter 分配给不同的键(例如,功能键、正确的 ctrl 或 win 键(如果您有它们或大写锁定))。