在mfc中捕获Ctrl + Z.

时间:2013-11-08 17:35:34

标签: mfc undo-redo

我正在尝试剪切/复制/粘贴我的应用程序,为此我需要捕获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。有人会建议一个更好的方法来处理多个击键吗?

2 个答案:

答案 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消息将发送到大型机。比命令处理程序将完成剩下的工作。击键永远不会到达控制中。