为什么没有FVIRTKEY,CreateAcceleratorTable()不起作用?

时间:2014-05-11 11:35:20

标签: c winapi

我想为CTRL + A创建一个加速器。我注意到当你遗漏FVIRTKEY时它不起作用,即下面的代码片段不起作用:

a.fVirt = FCONTROL;
a.key = 'A';
a.cmd = IDM_ADD;

(仅为了完整性而使用' a'而不是' A'也不起作用)

然而,这可以正常工作:

a.fVirt = FCONTROL|FVIRTKEY;
a.key = 'A';
a.cmd = IDM_ADD;

有人可以解释这种行为吗? MSDN说,如果没有设置FVIRTKEY," key"被解释为我认为是ASCII的字符代码。但它不起作用,让我有些困惑。

谢谢!

1 个答案:

答案 0 :(得分:1)

系统将某些 Ctrl 组合键转换为ASCII控制代码。组合 Ctrl + A 被转换为ASCII ctrl-A(SOH)字符(ASCII值0x01)。这就是为什么您的第一个代码段不会暴露所需行为的原因:它需要输入无法输入。这在MSDN中的Keyboard Input下记录。

另请注意,未提供FVIRTKEY标记会使指定的key区分大小写,即'a''A'映射到不同的输入。通常希望使用虚拟键码来提供一致的键盘UI。其含义在About Keyboard Accelerators - Accelerator Keystroke Assignments下解释。