1

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

4

2 回答 2

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检索指定虚拟键的状态。状态指定键是向上、向下还是切换(打开、关闭——每次按下键时交替)。

检查的关键是控制键,即:VK_CONTROL。您也可以参考GetAsyncKeyState更多支持的键名宏。

操作 (&0x80) 正在检查 SHORT(8 位)的单个高位 (MSB)

返回值:短

如果高位为1,则key为down;否则,它就起来了。

如果低位为 1,则按键切换

于 2013-11-10T15:33:34.680 回答
0

当 Ctrl+Z 在加速器列表中时(正如您在评论中所写),您不需要处理控制序列。您将收到一条 WM_COMMAND 消息,其中包含在加速器列表中定义的值。

加速器使处理击键变得更加容易和灵活。如果键序列在加速键列表中,则消息在 PreTranslateMessage 中进行翻译,并将 WM_COMMAND 消息发送到大型机。其余的将由命令处理程序完成。击键永远不会到达控件。

于 2013-11-10T16:15:48.323 回答