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

And*_*eas 2 c winapi

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

a.fVirt = FCONTROL;
a.key = '?';
a.cmd = IDM_HELP;
Run Code Online (Sandbox Code Playgroud)

我无法使用,FVIRTKEY因为似乎没有密钥的虚拟密钥代码?.有VK_OEM_2,但MSDN说,它映射到?按键只在美国键盘.我需要兼容各种欧洲键盘.

那我该怎么CTRL+?办呢?请注意,我不想使用资源,但是CreateAcceleratorTable().

Rem*_*eau 6

根据使用键盘加速器文档:

您可以通过定义一个加速器的击键指定ASCII字符代码或虚拟键码key所述的部件ACCEL结构.如果指定虚拟键代码,则必须先FVIRTKEYfVirt成员中包含该标志; 否则,系统将代码解释为ASCII字符代码.您可以包括FCONTROL,FALTFSHIFT标志,或所有三项,到CTRL,ALT或Shift与按键键组合.

?是一个ASCII字符,所以a.key = '?';如果你不启用FVIRTKEY标志就可以正常工作.

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

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

  • 创建SHIFT+?,无论是使用ASCII码或虚拟键码,既很好地工作.

  • 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
...
Run Code Online (Sandbox Code Playgroud)

但是,如果您真的需要加速器CTRL+[Char],例如CTRL+?,您将不得不使用包含该字符的键的虚拟键代码并省略该SHIFT状态,例如:

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

a.fVirt = FVIRTKEY | FCONTROL;
a.key = LOBYTE(VkKeyScan(ch));
a.cmd = ...;
Run Code Online (Sandbox Code Playgroud)

然后CTRL+[Char]会工作.