c++ - 如何在列表框窗口过程中捕获 VK_ESCAPE

标签 c++ winapi user-interface listbox

我在对话框中有一个自定义网格控件,我想弹出一个列表框以允许用户从一组预定义值中进行选择。我无法捕获 VK_ESCAPE 键,我已经将控件子类化。我试过 WM_KEYDOWN、WM_CHAR、WM_VKEYTOITEM,但都没有成功。我在创建列表框窗口 (CreateWindow) 时设置了以下样式WS_CHILD | LBS_HASSTRINGS | LBS_通知| WS_VSCROLL | LBS_WANTKEYBOARDINPUT。当显示列表框并按下 esc 键时,该键将传递给对话框,并像往常一样由对话框处理,因为对话框被取消并关闭。有什么想法可以在哪里/如何在列表框窗口过程中捕获 VK_ESCAPE 吗?我已经有一个子类编辑控件,我在网格控件中成功地做到了这一点。

最佳答案

做到这一点的方法是实现对 WM_GETDLGCODE 的处理。控件窗口过程中的消息(即,您想要拦截转义键的控件 - 因此在这种情况下,我认为它是您的弹出列表而不是网格控件)。

只要按下一个键,对话管理器就会将此消息发送到具有焦点的控件,并且返回值会影响键的处理方式。

例如:

   case WM_GETDLGCODE:
      if (lParam)
      {
         LPMSG lpmsg = (LPMSG)lParam;
         if (lpmsg->message == WM_KEYDOWN && lpmsg->wParam == VK_ESCAPE)
            return DLGC_WANTMESSAGE;
      }
      return 0;

如果您要将其添加到的控件不是自定义控件,而是例如是一个系统控件,您需要对其进行子类化以添加此处理。

陈峰也有一个blog posting on this topic .

关于c++ - 如何在列表框窗口过程中捕获 VK_ESCAPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21067801/

相关文章:

c++ - push_back on 2D std::vector< std::vector<char*>> value made all the values are the same

C++11 - move 语义在构造上很慢

java - 从链表中删除任何元素所需时间复杂度为 O(1) - Java 与 C++

eclipse - osgi.os 属性的 "win32"与 "win64"

c++ - Boost 有 GUI 库吗?

c++ - 如何设置 WINDOWCLASSX hbrBackground Alpha channel ? (C++)

java - 银行计划的转账和提款方式出现问题

c++ - 在没有 extern "C"的情况下在 C++ 中使用 dlsym

c++ - Winmouse在C++控制台上的坐标

C# 和 win32 API。在两个桌面之间切换。如何回到原来的桌面?