编辑控制捕获进入键

Edit control capture enter key

本文关键字:控制 编辑      更新时间:2023-10-16

我有一个编辑控件

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键。

提前谢谢你。

您需要子类化编辑控件并处理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);
}

我在dialog:

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

当前答案建议的方法陈旧。根据这个页面,有一种稍微简单的方法来子类化控件。

下面的示例显示了子类控件的窗口过程的框架实现。

LRESULT CALLBACK OwnerEditProc(HWND hWnd, UINT uMsg, WPARAM wParam,
                               LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData)
{
    switch (uMsg)
    {
    case WM_KEYDOWN:
        .
        .
        .
        return TRUE;
    // Other cases...
    } 
    return DefSubclassProc(hWnd, uMsg, wParam, lParam);
}

窗口过程可以附加到对话过程的WM_INITDIALOG处理程序中的控件上,如下例所示。

case WM_INITDIALOG:
{
    HWND control = GetDlgItem(hDlg, IDC_EDIT);
    SetWindowSubclass(control, OwnerEditProc, 0, 0);
    return TRUE;
}