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

我正在实现可以启动拖动事件的自定义控件。 当用户通过处理WM_LBUTTONDOWN并调用SetCapture()按下鼠标左键时,我开始拖动。 这将导致所有的鼠标事件,甚至是我的控制客户区域以外的鼠标事件都被发送到它,完全按照我的意愿。

我也想能够捕获按键,所以如果用户按下ESC键( VK_ESCAPE ),我可以取消拖动。 由于我的控件没有键盘焦点(我不希望它从拥有它的控件中窃取焦点),所以我不能听WM_KEYDOWN 。 由于其他原因太复杂解释,我也不希望使用DragDetect()函数。

当拖动正在进行时,我的控件如何findESC按键?

Solutions Collecting From Web of "在捕获鼠标的同时捕获键盘事件,但窗口未聚焦(Win32)"

事实证明,这是很容易的:

 // 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; // ... }