如何为CTRL +创建加速器?在代码中

时间:2018-12-06 16:23:20

标签: c winapi

我想使用CTRL+?为组合CreateAcceleratorTable()创建一个加速器。我该如何填写ACCEL结构?我已经尝试了以下方法,但是不起作用:

a.fVirt = FCONTROL;
a.key = '?';
a.cmd = IDM_HELP;

我无法使用FVIRTKEY,因为?密钥似乎没有虚拟密钥代码。有VK_OEM_2,但MSDN says仅在美国键盘上映射到?键。我还需要与各种欧洲键盘兼容。

那我应该如何为CTRL+?安装一个加速器?请注意,我不想使用资源,但是CreateAcceleratorTable()

2 个答案:

答案 0 :(得分:6)

根据Using Keyboard Accelerators文档:

  

您可以通过key结构的ACCEL成员中指定ASCII字符代码或虚拟键代码来定义加速键。如果指定虚拟键代码,则必须首先在FVIRTKEY成员中包含fVirt标志;否则,系统会将代码解释为ASCII字符代码。您可以包括FCONTROLFALTFSHIFT标志,也可以包括这三个标志,以将CTRL,ALT或SHIFT键与击键结合在一起。

?是ASCII字符,因此如果您未启用a.key = '?';标志,那么FVIRTKEY可以正常工作。

但是,?需要 SHIFT 键才能键入。通常,不能为需要 SHIFT 进行键入的任何ASCII字符创建 CTRL + [Char] 加速器,其中包括大写字母和符号~!@#$%^&*()_+{}|:"<>?

在这种情况下,要为ASCII ?字符创建加速器,您可以:

  • 使用ASCII代码或虚拟键代码创建 SHIFT +?都可以正常工作。

  • 仅使用虚拟键码创建 CTRL + SHIFT +?。如果您尝试将ASCII码用于?(或任何可移动的ASCII字符),则同时启用FCONTROLFSHIFT时,奇怪的是 SHIFT + [Char] 将触发WM_COMMAND消息!但是,使用虚拟键代码, CTRL + SHIFT + [Char] 可以正常工作。

要获取ASCII字符的虚拟键码,可以使用VkKeyScan()VkKeyScanEx()

  

将字符转换为相应的虚拟键代码和移位状态。

将ASCII字符转换为虚拟键码和移位位,然后将移位位转换为ACCEL标志。例如:

TCHAR ch = ...; // whichever ASCII character you want

SHORT res = VkKeyScan(ch);
WORD vk = LOBYTE(res);
WORD shift = HIBYTE(res);

a.fVirt = FVIRTKEY;
a.key = vk;
a.cmd = ...;

if (shift & 1) a.fVirt |= FSHIFT;
if (shift & 2) a.fVirt |= FCONTROL;
if (shift & 4) a.fVirt |= FALT;

// add on whichever additional control keys you need
...

但是,如果您确实想要 CTRL + [Char] 的加速器,例如 CTRL +?,则必须使用包含以下内容的键的虚拟键代码:字符并省略SHIFT状态,例如:

TCHAR ch = TEXT('?'); // or whatever

a.fVirt = FVIRTKEY | FCONTROL;
a.key = LOBYTE(VkKeyScan(ch));
a.cmd = ...;

然后 CTRL + [Char] 将起作用。

答案 1 :(得分:0)

尝试“ /”怎么样?

键盘加速器不带字符,例如?字符 您还可以使用https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-vkkeyscanexa将字符映射到虚拟键。