0

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消息中的选项卡,但是使用这种方法,选项卡键会明显地从编辑框中添加和删除。

有什么方法可以吃钥匙WM_KEYDOWN吗?

4

3 回答 3

5

您执行此操作的预期方法是处理WM_GETDLGCODE消息并告诉窗口管理器编辑控件不想处理该TAB键。Raymond Chen 在本文中讨论了这个问题:那些不了解对话管理器的人注定要重新实现它,非常糟糕。与雷蒙德的情况一样,这篇文章的标题颇具挑衅性。

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

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(...);
}
于 2013-05-21T10:53:24.960 回答
2
  1. PreTranslateMessage在您的对话类中覆盖。
  2. 如果MSG参数的messageisWM_KEYDOWNwParamisVK_TABhwndis 是您的编辑控件的参数,处理它并简单地返回 TRUE。

返回 TRUE 表示该事件已被处理,因此不会被CEdit控件处理。

于 2013-05-21T10:51:04.493 回答
0

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

一个 WinApi 教程应该可以帮助你,如何自己修改消息队列,resp。发送自己的消息,或阻止发送它们。

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

于 2013-05-21T10:41:02.907 回答