如何在WM_KEYDOWN中吃掉密钥

时间:2013-05-21 10:28:35

标签: c winapi

我在编辑框中处理WM_KEYDOWN消息 我正在处理一堆键,但是对于某些键(例如tab),我想阻止将可显示的字符附加到编辑框中。

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消息中的标签,但是使用此方法,标签键可以在编辑框中明显添加和删除。

有没有办法在WM_KEYDOWN吃一把钥匙?

3 个答案:

答案 0 :(得分:2)

  1. 在对话框类中覆盖PreTranslateMessage
  2. 如果MSG参数messageWM_KEYDOWNwParamVK_TABhwnd为您的编辑控件,则处理它只是返回TRUE。
  3. 返回TRUE表示该事件已被处理,因此CEdit控件不会处理该事件。

答案 1 :(得分:2)

执行此操作的目的是处理WM_GETDLGCODE消息并告诉窗口管理器编辑控件不想处理 TAB 键。 Raymond Chen在本文中讨论了这个问题:Those who do not understand the dialog manager are doomed to reimplement it, badly。正如雷蒙德的情况一样,这篇文章非常具有挑衅性。

文章中的代码示例如下所示:

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(...);
}

答案 2 :(得分:0)

捕获事件并自行传递消息。

WinApi教程应该帮助您,如何自己修改消息队列,等等。发送自己的消息,或阻止发送消息。

http://www.winprog.org/tutorial/message_loop.html