2013-03-29 24 views
6

Ich habe eine Bearbeitungssteuerbearbeiten Kontrolleinfangstelle Enter-Taste

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

und einen Knopf:

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

Gibt es eine Möglichkeit, um zu sehen, wenn die Enter-Taste gedrückt wird, während in dem Edit-Control eingeben und eine Nachricht senden wie die Taste gedrückt wurde?

denke ich, dass vielleicht

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

würde zum Senden der Nachricht, um die Arbeit tun, aber ich bin immer noch bei der Erfassung der Enter-Taste fest.

Vielen Dank im Voraus.

+0

Der traditionelle Weg, dies zu tun, ist eine Beschleuniger Tabelle zu deklarieren, die auf 'IDC_MAIN_SENDBUTTON' ENTER als Mapping definiert . Beachten Sie auch, dass 'GetModuleHandle (NULL)' nicht empfehlenswert ist, da die Fenster in den Namespace der primären ausführbaren Datei und nicht in das Modul, das das Fenster erstellt hat, eingefügt werden. –

Antwort

10

Sie müssen das Bearbeitungssteuerelement ableiten und WM_KEYDOWN-Nachricht behandeln. Wenn es der Schlüssel ist, den Sie möchten, senden Sie die Nachricht, andernfalls lassen Sie die Standard-Bearbeitungssteuerprozedur ihre Aufgabe erledigen.

Der Code möchte dies:

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

Ich mache es im 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); 
}