Problem mit WM_KEYUP
-
Erstmal Hallo^^
Bin neu hier im Forum, totaler Anfänger in der wind32 programmierung und wollte mal fragen ob ihr mir hier weiterhelfen könnt.Mein Problem: (hab dazu auch nichts in der such funktion gefunden)
Ich möchte das sich das Programm beendet, wenn man die ESC-Taste drückt. Das hab ich auch geschafft. Jetzt hab ich aber das Problem, sobald das Child-EDIT Fenster anktiv ist(wenn ich mit der Maus reinklicke) dann kommt die WM_KEYUP Nachricht nicht mehr an.
Danach hab ich es versucht als WM_COMMAND Nachricht zu verschicken.
Wenn ich jetzt ESC drücke passiert erstmal noch nichts. Wenn ich jetzt den Fokus wechsle kommt die Nachricht erst an. Das will ich so aber nciht^^Naja hier mal der Code dazu:
#include <windows.h> #define CHAT_OUTPUT 1 #define CHAT_INPUT 2 HWND bChatOutput, bChatInput; LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LPCSTR lpszName = "Chat"; HINSTANCE hInst; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) { HWND hWnd; MSG msg; WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = WndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = hInstance; wc.hCursor = LoadCursor(NULL,IDC_ARROW); wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszClassName = lpszName; wc.lpszMenuName = NULL; wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if(!RegisterClassEx(&wc)) { MessageBox(NULL, "Windows Registrations Fehler", "Error!", MB_ICONEXCLAMATION | MB_OK); return 0; } hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, lpszName, "Chat", WS_OVERLAPPED|WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX, CW_USEDEFAULT, CW_USEDEFAULT, 600, 400,NULL,NULL,hInstance, NULL); hInst=hInstance; if(hWnd == NULL) { if(MessageBox(NULL, "Fehler beim Erstellen des Fensters!", "Error!", MB_ICONEXCLAMATION | MB_OK) == IDOK); return 0; } if( hWnd == NULL) return 0; while (GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT umsg, WPARAM wParam, LPARAM lParam) { switch (umsg) { case WM_CREATE: bChatOutput = CreateWindow("EDIT","ChatOutput",WS_CHILD|WS_VISIBLE| WS_DLGFRAME|WS_VSCROLL|ES_MULTILINE|ES_READONLY, 10, 10, 567, 318, hWnd, (HMENU)CHAT_OUTPUT, ((LPCREATESTRUCT) lParam)->hInstance, NULL); bChatInput = CreateWindow("EDIT","ChatInput",WS_CHILD|WS_VISIBLE| WS_DLGFRAME|ES_AUTOHSCROLL, 10, 338, 567, 22, hWnd, (HMENU)CHAT_INPUT, ((LPCREATESTRUCT) lParam)->hInstance, NULL); return 0; case WM_KEYUP: if ( GetAsyncKeyState (VK_ESCAPE)) { int bAntwort = MessageBox(NULL,"Sie haben \"ESC\" gedrückt!\n" "Programm beenden?","Abfrage", MB_ICONINFORMATION | MB_OKCANCEL | MB_DEFBUTTON1); if(bAntwort == IDOK) PostQuitMessage(0); else break; } return 0; case WM_DESTROY: { PostQuitMessage(0); return 0; } case WM_COMMAND: if ( GetAsyncKeyState (VK_ESCAPE)) { int bAntwort; bAntwort = MessageBox(NULL,"Sie haben \"ESC\" gedrückt!\n" "Programm beenden?","Abfrage", MB_ICONINFORMATION | MB_OKCANCEL | MB_DEFBUTTON1); if(bAntwort == IDOK) PostQuitMessage(0); else break; } return 0; } return DefWindowProc(hWnd, umsg, wParam, lParam); }Naja wie gesagt bin noch totaler Anfänger und kenn mich gar nicht aus^^
Ich hoffe ihr könnt mir weiter helfen
mfg Nanobot
-
Das ist nur konsequent, denn nur das Fenster, dass den Focus hat (also Dein Child Window) bekommt WM_KEY... Nachrichten.
Wie wäre es wenn, Du einen modalen Dialog erzeugst, der hat immer das Verrhalten bei Escape zu schließen.
Ansonsten musst Du die Prüfung in die Message-Loop einbauen oder einen Accelerator verwenden, der eine entsprechende Nachricht versendet.
Ich würde zu letzterem Greifen.
Das sind evtl. für Dich noch alles böhmische Dörfer, aber leider Stoff zum Lernen und Nachschlagen für die Windows Programmierung.
Ich würde den Petzold durcharbeiten, dann lernst Du auch das...
-
Ich hab mir mal deinen Acclerator Hinweis zu herzen genommen und versucht zu realisieren. Leider hänge ich schon wieder:
Hab einen modalen Dialog mit der Nachricht "Wollen sie das Programm wirklich beenden". Und 2 Buttons Ja und Nein.
Dieser funkioniert auch.
Nur kann ich ihn nicht mit der Hotkey Taste Escape aufrufen.
Hier mal ein Teil der resource
IDR_EXITPROGRAM ACCELERATORS BEGIN VK_ESCAPE, ID_EXIT, VIRTKEY, NOINVERT ENDUnd dann wie ich den Dialog aufrufen möchte:
case WM_COMMAND: switch( LOWORD( wParam) ) { case ID_EXIT: DialogBox( hInst, MAKEINTRESOURCE(IDR_EXITPROGRAM), hWnd, (DLGPROC)ExitProc ); break; } return 0;mfg Nanobot
PS:
Gibts den Petzold auch in einer Online Version und wieviel würde er kosten?
-
1. Du brauchst keinen modalen Dialog für eune Frage, denn es gibt die API Funktion MessageBox
2. Wie hast Du TRanslateAccelerator in Deine Message Loop eingebaut?
-
Ich glaube ich hab jetzt die Funktionsweise von Accelerators verstanden.
Trozdem gibts noch Probleme
Hier erstmal die Message Loop, die überprüft ob ein Hotkey gedrückt wurde, wenn ja dann wird die message "ID_EXIT" gesendet
HACCEL hAccelTable; hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)ID_STRING_ACC); while (GetMessage(&msg, NULL, 0, 0) > 0) { if( !TranslateAccelerator (msg.hwnd, hAccelTable, &msg) ) { TranslateMessage(&msg); DispatchMessage(&msg); } }Und dann wird über die ID_EXIT im WM_COMMMAND der Dialog, die MessageBox oder was auch immer aufgerufen. Nur das Problem ist das nichts gesendet wird.
Wahrscheinlich hab ich wieder was vergessen

mfg Nanobot
-
Bei TranslateAccelerator musst Du das Handle des äußeren Fensters angeben, das die WM_COMMAND Nachricht bekommen soll. Nicht das Handle, des Fensters, das die WM_KEY Nachricht bekommt.
-
Juhuuu ich habe es geschaft

Vielen herzlichen Dank nochmal für deine ganzen Tipps!!
Haben mir wirklcih sehr weiter geholfen
Was ich falsch gemacht habe:
HACCEL hAccelTable; hAccelTable = LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_EXITPROGRAM));Da hab ich einfach die falsche Resource eingetragen.
if( !TranslateAccelerator (hWnd, hAccelTable, &msg) ) { TranslateMessage(&msg); DispatchMessage(&msg); }Und hier habe ich, wie du schon gesagt hast, einfach das falsche Handle angegeben.
thx nochmal!!
Nanobot