【问题标题】:How to handle keyboard events in a winapi standard dialog?如何在 winapi 标准对话框中处理键盘事件?
【发布时间】:2011-11-06 01:11:21
【问题描述】:

我不经常使用 winapi,我正在编写几乎 .NET 代码。但是这时候我不得不使用winapi来做一个简单的对话框。我想处理一些关键事件。因此,我在 MSDN 上查看了相应的回调消息 WM_KEYDOWN or WM_KEYUP 并将其添加到我的回调函数中。

INT_PTR CALLBACK cbfunc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
  switch(message) {
    // ...

    case WM_KEYUP:
        MMsgBox("up"); // I never get here
        return 0;

    case WM_KEYDOWN:
        MMsgBox("down"); // I never get here        
        return 0;

    // ...
  }
  return 0;
}

但是WM_KEYUPWM_KEYDOWN 都不会被触发。然后我说寻找这个问题的解决方案。我想我的对话可能会吃掉这些信息。所以我补充说:

    case WM_GETDLGCODE: 
        return DLGC_WANTALLKEYS;

结果它没有帮助。 我发现的其他解决方案如下:

  • 按照here 的建议,或者使用WM_GETDLGCODE 事件来处理此键。
  • 我发现很多线程(如this one)都在谈论一种称为PreTranslateMessage 的方法。但我什至没有这门课,因为我只是使用DialogBoxParam 创建我的对话框

所以它们都不适合我。目前我不知道如何处理它。我注意到,在按键时似乎会出现WM_COMMAND 消息。

问候 Nem。

【问题讨论】:

  • 您的消息处理程序是什么样的?我刚试过,对我来说效果很好(弹出消息框)。
  • 即使我注释掉其他所有内容,也没有任何反应。所以它看起来像上面发布的。
  • 不,我的意思是你的 whileGetMessage 的东西。抱歉,我想我应该说“消息循环”。
  • 没有,我认为是DialogBoxParam处理的。
  • 哦,没看到。你读过这个吗:support.microsoft.com/kb/117563

标签: c++ winforms winapi keyboard callback


【解决方案1】:

根据this link,某些消息很难被对话框捕获,因为Windows 在内部处理它们并且它们永远不会到达DialogProc。以下是我能想到的两个选项:

  1. WM_COMMAND 事件上使用GetAsyncKeyState
  2. 创建一个自定义对话框,DialogProc为其处理 WM_KEYDOWN 等消息。

【讨论】:

    【解决方案2】:

    替换这个

    案例 WM_KEYUP: MMsgBox("向上"); // 我从来没有到过这里 返回 0;

    case WM_KEYDOWN:
        MMsgBox("down"); // I never get here        
        return 0;
    

    有了这个

    案例 WM_KEYUP: MMsgBox("向上"); // 我从来没有到过这里 休息;

    case WM_KEYDOWN:
        MMsgBox("down"); // I never get here        
        break;
    

    【讨论】:

      【解决方案3】:

      DialogProc 不接收 WM_KEY 事件(以及许多其他事件)。你可以:

      1. 子类化对话窗口(覆盖其 WndProc)并处理所有 那里的消息,sample
      2. 为对话窗口的 HWND 注册热键,然后在 DlgProc 中接收 WM_HOTKEY(但注册的组合键将是系统范围的)
      3. 创建您自己的消息循环,link

      【讨论】:

        猜你喜欢
        • 2013-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-14
        • 2020-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多