如何在WM_KEYDOWN中吃键

问题描述 投票:0回答:3

我正在处理编辑框中的

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
中的钥匙吗?

c winapi
3个回答
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(...);
}

2
投票
  1. 覆盖对话框类中的
    PreTranslateMessage
  2. 如果
    MSG
    参数的
    message
    WM_KEYDOWN
    并且
    wParam
    VK_TAB
    并且
    hwnd
    是你的编辑控件,处理它并简单地返回 TRUE。

返回 TRUE 意味着该事件已经被处理,因此不会被

CEdit
控件处理。


0
投票

自己捕捉事件并传递消息。

WinApi 教程应该可以帮助您,了解如何自行修改消息队列。发送自己的消息,或阻止发送消息。

http://www.winprog.org/tutorial/message_loop.html

© www.soinside.com 2019 - 2024. All rights reserved.