【问题标题】:Edit control capture enter key编辑控件捕获回车键
【发布时间】:2013-03-29 20:57:58
【问题描述】:

我有一个编辑控件

HWND hInput = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", 
    WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 
    0, 0, 100, 100, hwnd, (HMENU)IDC_MAIN_INPUT, GetModuleHandle(NULL), NULL);

还有一个按钮:

HWND hSendButton = CreateWindowEx(WS_EX_CLIENTEDGE,"BUTTON","Send!",
        BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD,
        0,0,0,0,hwnd,(HMENU)IDC_MAIN_SENDBUTTON,GetModuleHandle(NULL),NULL);

有没有办法查看在编辑控件中键入时按下 Enter 键的时间 并像按下按钮一样发送消息?

我觉得可能

SendMessage(hwnd,WM_COMMAND,(WPARAM)IDC_MAIN_SENDBUTTON,LPARAM(0));

可以完成发送消息的工作,但我仍然无法捕获 Enter 键。

提前谢谢你。

【问题讨论】:

  • 执行此操作的传统方法是声明一个快捷键表,将 ENTER 定义为映射到 IDC_MAIN_SENDBUTTON。另请注意,GetModuleHandle(NULL) 不是最佳实践,因为它将您的窗口放在主可执行文件的命名空间中,而不是创建窗口的模块中。

标签: c++ winapi


【解决方案1】:

您需要子类化编辑控件并处理 WM_KEYDOWN 消息。如果它是您想要的密钥,请发送消息,否则,让默认的编辑控制过程完成它的工作。

代码如下:

WNDPROC oldEditProc;

LRESULT CALLBACK subEditProc(HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
   switch (msg)
   {
    case WM_KEYDOWN:
         switch (wParam)
         {
          case VK_RETURN:
          //Do your stuff
              break;  //or return 0; if you don't want to pass it further to def proc
          //If not your key, skip to default:
         }
    default:
         return CallWindowProc(oldEditProc, wnd, msg, wParam, lParam);
   }
   return 0;
}

void somecreateeditproc()
{
  HWND hInput = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", 
    WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 
    0, 0, 100, 100, hwnd, (HMENU)IDC_MAIN_INPUT, GetModuleHandle(NULL), NULL);

  oldEditProc = (WNDPROC)SetWindowLongPtr(hInput, GWLP_WNDPROC, (LONG_PTR)subEditProc);
}

【讨论】:

    【解决方案2】:

    我在对话框中做:

    BOOL CDialogObject::PreTranslateMessage(MSG* pMsg)
    {
        if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN)
        {
            SendMessage(WM_COMMAND, (WPARAM)IDC_BUTTON3,LPARAM(0));
        }
        return CDialog::PreTranslateMessage(pMsg);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多