2010-11-06 27 views
0

在我的界面中,我有幾個按鈕,一個組合框和一個顯示圖像序列的窗口。這些按鈕在序列中導航,但我也想通過鍵盤上的LEFT和RIGHT箭頭導航。編譯後鍵盤按鍵工作正常,因爲焦點設置在主窗口,但點擊按鈕或組合後,鍵盤按鍵不起作用。我在我的主循環中用SetFocus(main_hwnd)來管理它,但是當點擊組合框時不會發生反應。下面BUTTONS,COMBO BOX和KEYBOARD KEYS封鎖海誓山盟(winapi)

例子:

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 
{ 
    switch (message) 
    { 

     case WM_CREATE: 
     CreateWindowEx(0, "COMBOBOX", "", WS_CHILD | WS_VISIBLE | CBS_SORT | CBS_DROPDOWNLIST, 478, 5, 50, 200, hwnd, (HMENU)ID_COMBO1, GetModuleHandle(NULL), NULL); 
     break; 

     case WM_COMMAND: 
     break; 

     case WM_KEYDOWN: 
     switch(wParam) 
     { 
      case VK_SPACE: 
      PostQuitMessage(0); 
      break; 
     } 
     break; 

     case WM_DESTROY: 
      PostQuitMessage (0); 
      break; 

     default: 
      return DefWindowProc (hwnd, message, wParam, lParam); 
    } 
    // SetFocus(hwnd); 
    return 0; 
} 

assumig這個例子: 編譯後的空格鍵將工作,但點擊後組合框,它不會工作。如果我使用SetFocus(hwnd)SPACE KEY將始終工作,但組合框將被禁用。

感謝您的幫助。

回答

1

是的,你的窗口過程只針對那個窗口,組合框是一個單獨的窗口。我喜歡來處理我的熱鍵消息循環裏面,像這樣:

MSG msg; 

while (GetMessage(&msg, NULL, 0, 0) > 0) 
{ 
    if (msg.message == WM_KEYDOWN) 
    { 
     if ((UINT)msg.wParam == VK_SPACE) 
     { 
      return 0; // or use postquitmessage 
     } 
    } 

    TranslateMessage(&msg); 
    DispatchMessage(&msg); 
} 
+0

有許多與此代碼的問題:一個微妙的是,你吞下'WM_KEYDOWN'消息,同時控制仍然會收到相應的'WM_KEYUP'信息。但更重要的是,你重新發明了對話管理器,效果不佳:鍵盤導航應該使用[IsDialogMessage](http://msdn.microsoft.com/en-us/library/ms645498.aspx)和適當的處理'WM_GETDLGCODE'消息。 – IInspectable 2013-01-08 11:08:26

1

他們將鍵盤消息分派到焦點窗口。這不會是你的主窗口,組合框看到它。這通常由Windows內置的對話框邏輯處理,但您可能沒有創建對話框。不知道你想走多遠,任何類庫都會爲你處理這個問題,主要是在分派消息之前,通過對控件進行子分類並在消息循環中尋找導航鍵。