如何在winapi标准对话框中处理键盘事件?

Chr*_*ner 3 c++ keyboard winapi callback winforms

我不经常使用winapi,我写的几乎是.NET代码.但此时我必须使用winapi进行简单的对话.我想处理一些关键事件.因此我观察了相应的回调消息WM_KEYDOWNWM_KEYUP在MSDN上并将其添加到我的回调函数中.

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;
}
Run Code Online (Sandbox Code Playgroud)

但既WM_KEYUP不会WM_KEYDOWN触发也不会触发.然后我说找到解决这个问题的方法.我想我的对话可能会吃掉这些消息.所以我补充说:

    case WM_GETDLGCODE: 
        return DLGC_WANTALLKEYS;
Run Code Online (Sandbox Code Playgroud)

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

  • 或者使用WM_GETDLGCODE事件来处理此键,如此处所示.
  • 我发现很多线程(比如这个)谈论一个叫做的方法PreTranslateMessage.但我甚至没有这个课,因为我只是通过使用创建我的对话框DialogBoxParam

所以他们都没有为我工作.在那一刻我不知道如何处理它.我注意到的是,在按键时,WM_COMMAND似乎发生了一条消息.

问候内姆.

Set*_*gie 5

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

  1. 使用GetAsyncKeyStateWM_COMMAND事件
  2. 创建一个自定义对话框,DialogProc其中处理WM_KEYDOWN等消息.