如何在WM_KEYDOWN中吃键

Dab*_*zuk 0 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;
Run Code Online (Sandbox Code Playgroud)

我可以检测并删除消息中的选项卡WM_KEYUP,但使用此方法,可以明显地在编辑框中添加和删除选项卡键。

有什么办法可以吃掉钥匙吗WM_KEYDOWN

Dav*_*nan 5

执行此操作的预期方法是处理消息WM_GETDLGCODE并告诉窗口管理器编辑控件不想处理该TAB键。Raymond Chen 在这篇文章中讨论了这个问题:那些不理解对话管理器的人注定要重新实现它,非常糟糕。正如雷蒙德经常遇到的情况一样,这篇文章的标题相当具有挑衅性。

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

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