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 Numpad

    benutzen 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.


  • Mod

    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?


  • Mod

    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


  • Mod

    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
    END
    

    in 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?


  • Mod

    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.


  • Mod

    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.


Anmelden zum Antworten