2013-03-29 16 views
6

У меня есть элемент управления редактированияEdit введите ключ

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

будет делать работу для отправки сообщения, но я все еще застряли в захвате клавишу ввода.

Заранее спасибо.

+0

Традиционный способ сделать это, чтобы объявить таблицу акселератора, который определяет ENTER, как отображение в 'IDC_MAIN_SENDBUTTON' , Также обратите внимание, что 'GetModuleHandle (NULL)' не является лучшей практикой, поскольку он помещает ваши окна в пространство имен основного исполняемого файла, а не модуль, который создал окно. –

ответ

10

Вам необходимо подклассифицировать элемент управления редактированием и обработать сообщение 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); 
} 
0

Я делаю это в диалоге:

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); 
} 
Смежные вопросы