簡體   English   中英

如何在winapi標准對話框中處理鍵盤事件?

[英]How to handle keyboard events in a winapi standard dialog?

我不經常使用winapi,我寫的幾乎是.NET代碼。 但此時我必須使用winapi進行簡單的對話。 我想處理一些關鍵事件。 因此,我在MSDN上觀察了相應的回調消息WM_KEYDOWNWM_KEYUP ,並將其添加到我的回調函數中。

INT_PTR CALLBACK cbfunc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
  switch(message) {
    // ...

    case WM_KEYUP:
        MMsgBox("up"); // I never get here
        return 0;

    case WM_KEYDOWN:
        MMsgBox("down"); // I never get here        
        return 0;

    // ...
  }
  return 0;
}

WM_KEYUPWM_KEYDOWN都不會被觸發。 然后我說找到解決這個問題的方法。 我想我的對話可能會吃掉這些消息。 所以我補充說:

    case WM_GETDLGCODE: 
        return DLGC_WANTALLKEYS;

結果它沒有幫助。 我發現的其他解決方案如下:

  • 或者使用WM_GETDLGCODE事件來處理此鍵,如此處所示
  • 我發現很多線程(比如這個 )討論了一個名為PreTranslateMessage的方法。 但我甚至沒有這個類,因為我只是使用DialogBoxParam創建我的對話框

所以他們都沒有為我工作。 在那一刻我不知道如何處理它。 我注意到的是,在按鍵時,似乎發生了WM_COMMAND消息。

問候內姆。

根據此鏈接 ,某些消息很難與對話框一起捕獲,因為Windows在內部處理它們並且它們永遠不會到達DialogProc 以下是我能想到的兩個選項:

  1. WM_COMMAND事件上使用GetAsyncKeyState
  2. 創建一個自定義對話框, DialogProc 處理WM_KEYDOWN等消息。

DialogProc不接收WM_KEY事件(以及其他許多事件)。 您可以:

  1. 對對話窗口進行子類化(覆蓋其WndProc)並處理所有消息, sample
  2. 為對話框窗口的HWND注冊熱鍵,然后在DlgProc中接收WM_HOTKEY(但注冊的組合鍵將在系統范圍內)
  3. 創建自己的消息循環, 鏈接

替換這個

case WM_KEYUP:MMsgBox(“up”); //我從來沒有回到這里0;

case WM_KEYDOWN:
    MMsgBox("down"); // I never get here        
    return 0;

有了這個

case WM_KEYUP:MMsgBox(“up”); //我從來沒有在這里休息

case WM_KEYDOWN:
    MMsgBox("down"); // I never get here        
    break;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM