WM_KEYDOWN funktioniert nicht mehr nach Benutzen eines Buttons oder einer Editbox, help!
-
Hi,
In meinem Programm kann der Benutzen die:
- Pfeil-Tasten
- Escape-Taste
- das Numpadbenutzen um verschiedene aktionenzu tätigen, sprich er verändert die Größe einer Variable. Doch nachdem ich eine Editbox oder ein Button von meiem Programm benutzt habe, reagiert mein Programm nicht mehr auf die Tasten. Wisoe?
Für Hilfe bin ich sehr dankbar.Gruß Tobi.
-
Nur das Control bekommt die Keyboard Nachrichten, dass den Focus hat. Hat also Button oder Edit Control den Focus, dann bekommst Du keine Nachrichten mehr an den Dialog oder das Fenster.
Lösen liese sich das nur über:
1. Eigene Messageloop
2. Accelerator für Deine speziellen Befehle, die Control übergreifend funktionieren (auch das erfodert einen Eingriff in die MessagLoop)Solltest Du einen modalen Dialog haben, der über die Windows Funktionen angezeigt wird. Dan hast Du schonmal Pech gehabt, denn Du hast keinen Zugriff auf die Message Loop in diesem Fall!
-
ne es ist ein normales winapi fenster
-
wie bau ich mir ne eigene messageloop und wozu?
-
T0bi schrieb:
wie bau ich mir ne eigene messageloop und wozu?
Ähhhh... verstehe ich nicht. Du hast doch dann schon eine Message Loop!
-
jo die vom mainWindow.. aber ich weiss nicht was ich da rein baun muss das das mit dem focus klappt
-
T0bi schrieb:
jo die vom mainWindow.. aber ich weiss nicht was ich da rein baun muss das das mit dem focus klappt
Dann versuche zu verstehen was TranslateMessage, IsDialogMessage und TranslateAccelerator tun. Dann kommst Du vieleicht drauf...
-
also da ich nicht mit einem dialog arbeite brauch IsDialogMessage auch nicht, richt? hm anscheind muss ich dann also eine accel tabele anlegen... aber wie macht man sowas?
Ok man braucht CreateAcceleratorTable() und ACCEL, wobei accel ein array sein muss oder? nur wo und wie mach ich definition von accel ?
-
Hm ich hab mich jetzt mal daran probiert aber es tut sich nichts, wenn ich die taste drücke. Hier mal die Teile wo ich jetzt was gemacht habe:
(1) der header für die IDs
//////////////////////////////////////////////////////////////////////////////// // ACCELERATOR #define ID_ACCEL_ESC 7000 #define ID_ACCEL_UP 7001 #define ID_ACCEL_DOWN 7002 #define ID_ACCEL_LEFT 7003 #define ID_ACCEL_RIGHT 7004(2) die .rc datei
//////////////////////////////////////////////////////////////////////////////// // ACCELERATOR accelTabel ACCELERATORS BEGIN VK_ESCAPE, ID_ACCEL_ESC VK_UP, ID_ACCEL_UP VK_DOWN, ID_ACCEL_DOWN VK_LEFT, ID_ACCEL_LEFT VK_RIGHT, ID_ACCEL_RIGHT ENDin der main .cpp datei
// ... // ***** load accelerators ***** hAccel = LoadAccelerators( hInstance, "accelTable" ); while( !done ) { if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) { if( msg.message == WM_QUIT ) { done = true; } else { if( !( TranslateAccelerator( hWnd, hAccel, &msg ) ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } } } } // ... // in der command // ***** accelerators ***** case ID_ACCEL_UP: { if( rX < 360.0f ) rX += 3.0f; if( !bFull ) { SetScrollPos( hScroll_rx, SB_CTL, rX, true ); } break; } case ID_ACCEL_DOWN: { if( rX > 0.0f ) rX -= 3.0f; if( !bFull ) { SetScrollPos( hScroll_rx, SB_CTL, rX, true ); } break; } case ID_ACCEL_LEFT: { if( rY > 0.0f ) rY -= 3.0f; if( !bFull ) { SetScrollPos( hScroll_ry, SB_CTL, rY, true ); } break; } case ID_ACCEL_RIGHT: { if( rY < 360.0f ) rY += 3.0f; if( !bFull ) { SetScrollPos( hScroll_ry, SB_CTL, rY, true ); } break; }hm was ist jetzt noch net richtig?
-
hab ich vieleicht die accelerator tabelle falsch definiert?
-
T0bi schrieb:
hab ich vieleicht die accelerator tabelle falsch definiert?
Sieht gut aus!
1. Wird hAccel geladen? Ich sehe keine Fehlerbehandlung!
2. Bei TranslateAccelerator musst Du das Window Handle angeben, das die WM_COMMAND Handler für Deine Accelerator IDs beherbergt.
3. Du hast dasin einem WM_COMMAND Handler eingebaut? Ich sehe diesen Codeausschnitt nicht!
4. Nur am Rande. Warum verwendest Du PeekMessage und nicht GetMessage? Diese Messageloop frisst 100% Prozessor Ressourcen!
-
1. Wird hAccel geladen? Ich sehe keine Fehlerbehandlung!
Hm anscheind kann die Tabelle nicht gladen werden, Fehler:
Der angegebene Ressourcenname wurde nicht in der Image-Datei gefunden.2. Bei TranslateAccelerator musst Du das Window Handle angeben, das die WM_COMMAND Handler für Deine Accelerator IDs beherbergt.
hWnd ist das Handle vom main Window, in desen WM_COMMAND arbeite ich auch die IDs der accels ab.
3. Du hast dasin einem WM_COMMAND Handler eingebaut? Ich sehe diesen Codeausschnitt nicht!
wie meinst du das in einem WM_COMMAND handler? Ich habs lediglich nur in die WM_COMMAND unter switch LOWORD( wParam ) geschoben.
4. Nur am Rande. Warum verwendest Du PeekMessage und nicht GetMessage? Diese Messageloop frisst 100% Prozessor Ressourcen!
Sorry habs behoben, das is bei mir noch aus dem Tutorial von NeHe hängen geblieben.
Also alle sin allem scheints beim laden der Tabelle die Probleme zu geben. Muss ich da irgendwie mit MAKEINTRESOURCE arbeiten?
Gruß Tobi.
-
Entschuldige aber langsam habe ich keine Lust mehr...
Muss man jede Zeile Code bei Dir diskutieren?
Lies den Petzold und lerne.1. Das mit dem Handler meinte ich, dass Du das als WM_COMMAND Nachricht bekommst. Ich konnte nicht sehen auf welche Nachricht Du reagierst.
2. Dann ist die Table nicht in Deiner EXE. Lade die fertige EXE mit dem Ressourcen-Editor.
-
ihat der bcb6 überhaupt nen recourssen editor? der hat doch nur nen image editor net mehr.
Egal habs jetzt hin bekomm das er die Tablle erfolgrich lädt... passiern tut trotzdem nicht...
-
OKay ich nehme alle zurück, ich danke dir wirklich vielmals für deine mühe Martin, jetzt klappt alles

Danke.
Gruß Tobi.