我想使用CTRL+?
为组合CreateAcceleratorTable()
创建一个加速器。我该如何填写ACCEL
结构?我已经尝试了以下方法,但是不起作用:
a.fVirt = FCONTROL;
a.key = '?';
a.cmd = IDM_HELP;
我无法使用FVIRTKEY
,因为?
密钥似乎没有虚拟密钥代码。有VK_OEM_2
,但MSDN says仅在美国键盘上映射到?
键。我还需要与各种欧洲键盘兼容。
那我应该如何为CTRL+?
安装一个加速器?请注意,我不想使用资源,但是CreateAcceleratorTable()
。
答案 0 :(得分:6)
根据Using Keyboard Accelerators文档:
您可以通过在
key
结构的ACCEL
成员中指定ASCII字符代码或虚拟键代码来定义加速键。如果指定虚拟键代码,则必须首先在FVIRTKEY
成员中包含fVirt
标志;否则,系统会将代码解释为ASCII字符代码。您可以包括FCONTROL
,FALT
或FSHIFT
标志,也可以包括这三个标志,以将CTRL,ALT或SHIFT键与击键结合在一起。
?
是ASCII字符,因此如果您未启用a.key = '?';
标志,那么FVIRTKEY
可以正常工作。
但是,?
需要 SHIFT 键才能键入。通常,不能为需要 SHIFT 进行键入的任何ASCII字符创建 CTRL + [Char] 加速器,其中包括大写字母和符号~!@#$%^&*()_+{}|:"<>?
。
在这种情况下,要为ASCII ?
字符创建加速器,您可以:
使用ASCII代码或虚拟键代码创建 SHIFT +?都可以正常工作。
仅使用虚拟键码创建 CTRL + SHIFT +?。如果您尝试将ASCII码用于?
(或任何可移动的ASCII字符),则同时启用FCONTROL
和FSHIFT
时,奇怪的是 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将字符映射到虚拟键。