Tastatur abfragen klappt nicht
-
ändert leider alles nichts

-
Bist du dir sicher, dass die WndProc auch verwendet wird? Oder wird evtl auch nur WM_HELP geschickt?
-
das ist meine ganze Proc
BOOL CALLBACK dlg(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_KEYDOWN: switch(wParam) { case VK_F2: Beep(2000, 2000); ShowWindow(hDlg, SW_HIDE); break; } return 0; case WM_INITDIALOG: SendMessage(GetDlgItem(hDlg, IDC_STATIC1), WM_SETFONT, (WPARAM)CreateFont(22, 0, 0, 0, FW_BOLD, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, TEXT("Arial")), 0); SetWindowLong(hDlg, GWL_EXSTYLE, GetWindowLong(hDlg, GWL_EXSTYLE) | WS_EX_LAYERED); // setze es später bisschen transparent mainDlg = hDlg; return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case IDCANCEL: ShowWindow(mainDlg, SW_HIDE); return TRUE; case IDC_BUTTON3: return TRUE; case IDC_BUTTON4: return TRUE; case IDC_BUTTON8: return TRUE; case IDC_BUTTON5: return TRUE; case IDC_BUTTON1: return TRUE; case IDC_BUTTON2: return TRUE; } break; } return FALSE; }natürlich ist es die richtige WndProc, hab nur eine und nur einen Dialog und der Rest funktioniert auch. Bin ich dämlich oder was ist an meinem Fenster los?
-
Eventuell hat eins der Controls den Fokus? Dann kriegt das Child WM_KEYDOWN, nicht der Dialog. Falls du Tasten auch dann empfangen willst, kannst du 'nen Hook setzen:
LRESULT CALLBACK KeyboardHook( int code, WPARAM wpar, LPARAM lpar ) { if ( code < 0 ) return CallNextHookEx( kb_hook, code, wpar, lpar ); if ( code==HC_ACTION && wpar==VK_F1 ) { // Was auch immer du tun willst ... // return!=0 damit der Keypress nicht weiter bearbeitet wird return 1; } return CallNextHookEx( kb_hook, code, wpar, lpar ); } ... kb_hook = SetWindowsHookEx( WH_KEYBOARD, &KeyboardHook, NULL, GetCurrentThreadId() ); ... UnhookWindowsHookEx( kb_hook );
-
danke!! es klappt
-
immer wenn ich F1 drücke, wird mein Code gleich 2 mal ausgelöst auch wenn ich nur ganz kurz drücke. Wie kann ich das ändern?
-
Hi,
case WM_KEYDOWN: switch(wParam) { case VK_F1: if( !bKeyDown ) { bKeyDown = TRUE; Beep(2000, 2000); ShowWindow(hDlg, SW_HIDE); } break; } return TRUE; case WM_KEYUP: switch(wParam) case VK_F1: bKeyDown = FALSE; break; .....Waere jetzt meine spontane Idee.
Peace & Blessed Love C0de4Fun
-
aber bei dem hook gibt es keine cases
-
theking500 schrieb:
immer wenn ich F1 drücke, wird mein Code gleich 2 mal ausgelöst auch wenn ich nur ganz kurz drücke. Wie kann ich das ändern?
Schau dir mal in der MSDN die Beschreibung zu "KeyboardProc" an. Aus dem letzten Bit des lparams kannst du bestimmen, ob die Taste unten oder oben ist (brauchst ja nur auf eins von beiden reagieren)

-
if (code == WM_KEYDOWN && wpar == VK_F1 && lpar == 0)warum funktioniert das so nicht? Dann müsste es doch nur 1 mal aktiviert werden oder?
-
Es kommt nur auf das oberste Bit von lpar an, du fragst mit
==0ja alle Bits ab. Undcodedürfte eigentlich nichts mit WM_KEYDOWN zu tun haben sondern auf HC_ACTION stehen..
PS: http://msdn.microsoft.com/en-us/library/ms644984.aspx
-
und wie komme ich auf das oberste bit

-
if ( lpar & 0x80000000 ) Oberstes Bit gesetzt else Oberstes Bit nicht gesetztWeil 80000000(hex) == 10000000000000000000000000000000(binär)