我想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().
根据使用键盘加速器文档:
您可以通过定义一个加速器的击键指定ASCII字符代码或虚拟键码在
key所述的部件ACCEL结构.如果指定虚拟键代码,则必须先FVIRTKEY在fVirt成员中包含该标志; 否则,系统将代码解释为ASCII字符代码.您可以包括FCONTROL,FALT或FSHIFT标志,或所有三项,到CTRL,ALT或Shift与按键键组合.
?是一个ASCII字符,所以a.key = '?';如果你不启用FVIRTKEY标志就可以正常工作.
但是,?需要SHIFT密钥才能输入密钥.通常,您无法CTRL+[Char]为需要SHIFT键入的任何ASCII字符创建加速器,包括大写字母和符号~!@#$%^&*()_+{}|:"<>?.
在这种情况下,要为ASCII ?字符创建加速器,您可以:
创建SHIFT+?,无论是使用ASCII码或虚拟键码,既很好地工作.
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
...
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]会工作.
| 归档时间: |
|
| 查看次数: |
88 次 |
| 最近记录: |