2013-12-08 147 views
1

我正在实现可以启动拖动事件的自定义控件。当用户通过处理WM_LBUTTONDOWN并且呼叫SetCapture()按下鼠标左键时,我开始拖动。这会导致所有鼠标事件,即使是我的控制客户区域外的鼠标事件,都会发送到它,完全按照我的意愿。捕获鼠标被捕获但窗口未聚焦的键盘事件(Win32)

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

我的控件在拖动过程中如何找到ESC按键?

+1

短期使用全局键盘钩子的,我不认为你可以。 – edtheprogrammerguy

+0

无论您的应用程序中哪个控件具有焦点,“WM_KEYDOWN”消息都会进入消息循环,因此您可以直接测试它们,并在看到退出键时中止拖动。 –

回答

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; 

    // ... 

}