2013-12-08 88 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; 

    // ... 

}