我正在尝试剪切/复制/粘贴我的应用程序,为此我需要捕获Ctrl + Z等。 我在OnKeyDown()事件处理程序中编写了以下代码:
if(GetKeyState(VK_CONTROL)<0)
{
WPARAM wparam = (WPARAM(nChar));
switch(wparam)
{
case 'z':
//display message box
break;
default:
break;
}
}
但我的问题是多笔击键永远不会被捕获。我可以按住Ctrl键或任何其他键来按下单键按钮。但是如果我在键盘上按Ctrl + Z,则只捕获ctrl并忽略z。有人会建议一个更好的方法来处理多个击键吗?
答案 0 :(得分:1)
试试这个:
if (GetKeyState(VK_CONTROL)&0x80)
{ if ((nChar==_T('z'))||(nChar==_T('Z')))
{ // indicate activity
Beep(800, 50);
}
}
其他信息:
来自MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/ms646301(v=vs.85).aspx
函数GetKeyState
检索指定虚拟键的状态。状态指定键是上,下或切换(每次按下键时开启,关闭 - 交替)。
要检查的键是control-key,即:VK_CONTROL。您还可以参考GetAsyncKeyState
获取更多支持的密钥名宏。
操作(&amp; 0x80)正在检查SHORT(8位)的单个高位(MSB)
返回值:SHORT
如果高位为1,则键为关闭;否则,它就结束了。
如果低位为1,则切换键
答案 1 :(得分:0)
当Ctrl + Z在加速器列表中时(正如您在注释中所写),比您不需要处理控制序列。您将收到一条WM_COMMAND消息,其中包含在加速器列表中定义的值。
加速器可以更轻松,更灵活地处理击键。如果密钥序列在加速器列表中,则消息将在PreTranslateMessage中转换,并且WM_COMMAND消息将发送到大型机。比命令处理程序将完成剩下的工作。击键永远不会到达控制中。