捕获鼠标时捕获键盘事件但窗口未聚焦(Win32)

时间:2013-12-08 23:01:38

标签: c++ c windows winapi

我正在实现一个可以启动拖动事件的自定义控件。当用户通过处理WM_LBUTTONDOWN并调用SetCapture()按下鼠标左键时,我会启动拖动。这会导致所有鼠标事件(即使是我控件的客户区域外的事件)被发送到它,正如我想要的那样。

我还希望能够捕获按键,这样我就可以在用户按下ESC键(VK_ESCAPE)时取消拖动。由于我的控件没有键盘焦点(并且我不希望它将焦点从具有它的控件上移开),我无法听取WM_KEYDOWN。由于其他原因太复杂而无法解释,我也不愿意使用DragDetect()函数。

当拖拽正在进行时,我的控制如何找出有关ESC按键的信息?

1 个答案:

答案 0 :(得分:1)

事实证明这很简单:

// message loop...
switch (msg)
{
    // ...

    case WM_LBUTTONDOWN:
        // do some stuff
        RegisterHotKey(hwnd, 0 /* id */, 0, VK_ESCAPE);
        // do some more stuff
        break;

    // ... 

    case WM_HOTKEY:
        if (VK_ESCAPE == HIWORD(lParam) &&
            IDHOT_SNAPDESKTOP != wParam &&
            IDHOT_SNAPWINDOW != wParam)
            {
            // handle ESC keypress
            UnregisterHotKey(hwnd, 0 /* id */);
            }
        break;

    // ...

}