c - 如何在 WM_KEYDOWN 中吃 key

标签 c winapi

我在编辑框中处理 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 中有没有办法吃掉 key ?

最佳答案

您执行此操作的预期方法是处理 WM_GETDLGCODE消息并告诉窗口管理器编辑控件不想处理 TAB 键。 Raymond Chen 在这篇文章中涵盖了这个问题:Those who do not understand the dialog manager are doomed to reimplement it, badly .与雷蒙德的情况一样,这篇文章的标题很有挑衅性。

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

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(...);
}

关于c - 如何在 WM_KEYDOWN 中吃 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16667786/

相关文章:

c - Valgrind 崩溃并给我这个无效的 realloc 警告

c++ - 登录到 Tizen 中的特定文件?

c - 寻找一个可以检测类似于 Collat​​z 猜想的序列是否终止的 C 程序

c++ - 打印时GDI折线部分输出

c++ - 在 C++ 中获取所有打开窗口的列表并存储它们

c - 读取带有浮点的文件,计算 C 中的大小、最大值、最小值、平均值、中值和标准差

相当于 C fscanf 的 Java

c++ - 更改窗口中的标签

c++ - 将我的应用程序与内核连接的最佳方式是什么?

C++ 程序将一个进程带到前台,如果已经在运行,否则创建一个新进程