2013-05-21 40 views
0

在編輯框中處理WM_KEYDOWN消息。
我正在處理一堆鍵,但對於某些鍵(例如。選項卡),我想防止顯示的字符被追加到編輯框。如何吃WM_KEYDOWN中的鍵

case WM_KEYDOWN: 
    { 
     switch(wParam) 
     { 
     case VK_TAB: 
      //handle tab here 
      //Eat tab key 
      return 0; 
     default: 
      return DefWndProc(hwnd,message,wParam,lParam); 
     } 
    } 
    break; 

我可以檢測和在WM_KEYUP消息刪除選項卡,但用這種方法tab鍵可見地添加和編輯框除去。

有什麼方法可以吃WM_KEYDOWN

+1

您是否嘗試過處理'WM_CHAR'呢? – Cubic

回答

2
  1. 在對話框類覆蓋PreTranslateMessage
  2. 如果MSG參數的messageWM_KEYDOWNwParamVK_TABhwnd是你編輯的控制,處理,並簡單地返回TRUE。

返回TRUE意味着該事件已被處理,因此不會被CEdit控件處理。

+0

這完美的伎倆,謝謝! – Daboyzuk

2

您要做到這一點的預期方法是處理WM_GETDLGCODE消息並告訴窗口管理器編輯控件不想處理密鑰的TAB密鑰。 Raymond Chen在本文中涵蓋了這個問題:Those who do not understand the dialog manager are doomed to reimplement it, badly。 Raymond經常遇到這種情況,這篇文章頗具挑釁性。

從文章的代碼示例如下:

LRESULT CALLBACK SubclassWndProc(
    HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 
{ 
    LRESULT lres; 
    switch (uMsg) { 
    case WM_GETDLGCODE: 
    lres = CallWindowProc(...); 
    lres &= ~DLGC_WANTTAB; 
    if (lParam && 
     ((MSG *)lParam)->message == WM_KEYDOWN && 
     ((MSG *)lParam)->wParam == VK_TAB) { 
     lres &= ~DLGC_WANTMESSAGE; 
    } 
    return lres; 
    } 
    return CallWindowProc(...); 
} 
+0

我對此一無所知!那麼我的回答錯了? (即使它完成了工作) –

+0

@AnishRam我不會說你的答案是錯誤的。而且我不是對話管理器的專家。關於應用程序的具體設計和架構還有點不清楚。然而,我會說,如果一個基於WM_GETDLGCODE的方法解決了這個問題,那麼基於WM_GETDLGCODE方法是最好的解決方案。 –

+0

看來確實如此。感謝您的回答:) –