WM_KEYDOWN in Editfenster nutzen
-
Ich will in einem Editfenster, also in einem, wo man Text eingeben kann, die Message WM_KEYDOWN nutzen. Das Problem ist, dass diese deaktiviert wird im Editfenster. Eigentlich brauche ich auch nur die Entertaste, um mit ihr dann die Speicherung des Textes in einen Buffer auszulösen. Für diesen Zweck gibt es auch bei CreateWindow den Style ES_WANTRETURN, mit dem man in mehrzeiligen Editfenstern Enter für andere Zwecke als Zeilenumbruch nutzen kann. Nur funktioniert es nicht.. Ich will auf Enter eine MessageBox ausl;sen, welche aber nicht kommt. Sobald ich jedoch den Fokus auf das Parentwindow lenke funktioniert es. Also liegt es irgendwie am Editfenster. Hier mein Code. Ich hoffe jemand weiß meinen Fehler. Man beachte nur WM_CREATE und WM_KEYDOWN. Bei WM_SETFOCUS kann man den Fokus auf hwnd, also das parent setzen, und die messagebox unter WM_KEYDOWN wird ausgeführt. Aber wie kann man nun auch Enter mit dem Fokus auf das Editfenster nutzen?
#include <windows.h> #define ID_EDIT 1 LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM); TCHAR szAppName[] = TEXT ("X") ; char * lpString; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = WndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass.lpszClassName = szAppName ; if (!RegisterClass (&wndclass)) { // UNICODE-Compilierung ist die einzige realistische Fehlermöglichkeit MessageBox (NULL, TEXT ("Programm arbeitet mit Unicode und setzt Windows NT voraus!"), szAppName, MB_ICONERROR) ; return 0 ; } hwnd = CreateWindow (szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindow (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } return msg.wParam ; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static HWND hwndEdit ; switch (message) { case WM_CREATE : hwndEdit = CreateWindow (TEXT ("edit"), NULL, WS_CHILD | WS_VISIBLE | WS_BORDER | ES_LEFT | ES_AUTOHSCROLL | ES_MULTILINE | ES_WANTRETURN, 0, 0, 0, 0, hwnd, (HMENU) ID_EDIT, ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ; return 0 ; case WM_SETFOCUS : SetFocus (hwndEdit) ; return 0 ; case WM_SIZE : MoveWindow (hwndEdit, 10, 19, 400,20, TRUE) ; return 0 ; case WM_DESTROY : PostQuitMessage (0) ; return 0 ; case WM_KEYDOWN: switch(wParam) { case VK_RETURN: MessageBox(NULL,TEXT("X"),TEXT("HDHF"),0); break; } return 0; } return DefWindowProc (hwnd, message, wParam, lParam) ; }
-
Cyber Samurai schrieb:
Für diesen Zweck gibt es auch bei CreateWindow den Style ES_WANTRETURN, mit dem man in mehrzeiligen Editfenstern Enter für andere Zwecke als Zeilenumbruch nutzen kann.
Korrekt. Und - ist Dein Edit auch mehrzeilig?
-
Ja, mit dem Style ES_MULTILINE gibt man es unter CreateWindow an. Funktioniert dennoch nicht.
-
Oh, ich hab auch Schwachsinn gepostet, hätte mir Deinen Code mal richtig anschauen sollen
. Du musst natürlich subclassen, da das Edit keine WM_KEYDOWN-Nachrichten an sein Parent sendet
.
-
Das geht nur über 'Subclassen' der beteiligten Editfelder! Hier fügst Du vor der üblichen Windows-Bearbeitung eine eigene CALLBACK-Funktion ein, in der jede Benutzereingabe abgefangen werden kann.
Nicht ganz einfach 