我正在实现一个可以启动拖动事件的自定义控件。当用户通过处理WM_LBUTTONDOWN
并调用SetCapture()
按下鼠标左键时,我会启动拖动。这会导致所有鼠标事件(即使是我控件的客户区域外的事件)被发送到它,正如我想要的那样。
我还希望能够捕获按键,这样我就可以在用户按下ESC键(VK_ESCAPE
)时取消拖动。由于我的控件没有键盘焦点(并且我不希望它将焦点从具有它的控件上移开),我无法听取WM_KEYDOWN
。由于其他原因太复杂而无法解释,我也不愿意使用DragDetect()
函数。
当拖拽正在进行时,我的控制如何找出有关ESC按键的信息?
答案 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;
// ...
}