【问题标题】:How to eat keys in WM_KEYDOWN如何在 WM_KEYDOWN 中吃掉键
【发布时间】:2013-05-21 10:28:34
【问题描述】:

我正在编辑框中处理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有什么方法可以吃掉钥匙吗?

【问题讨论】:

  • 您是否尝试过处理WM_CHAR

标签: c winapi


【解决方案1】:

您的预期方法是处理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(...);
}

【讨论】:

  • 我不知道这个!那我的回答错了吗? (即使它完成了工作)
  • @AnishRam 我不会说你的答案是错误的。而且我不是对话管理器的专家。而且关于该应用程序的确切设计和架构仍然有些不清楚。但是,我想说,如果基于 WM_GETDLGCODE 的方法解决了问题,那么基于 WM_GETDLGCODE 的方法很可能是最佳解决方案。
  • 看起来确实如此。谢谢你的回答:)
  • @AnishRamaswamy 您的方法更适合 VK_TAB 以外的键。
  • @MarkRansom,怎么会这样?
【解决方案2】:
  1. 在对话类中覆盖 PreTranslateMessage
  2. 如果MSG 参数的messageWM_KEYDOWNwParamVK_TAB,而hwnd 是您的编辑控件的hwnd,则处理它并简单地返回TRUE。

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-28
      • 2017-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      相关资源
      最近更新 更多