Tastendruck in dialogbox



  • cpp schrieb:

    while(GetMessage(&msg,NULL,0,0))
    {
        if(!IsDialogMessage(play.GetPointer(), &msg))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    

    geht auch nicht 😞

    Edit: habe gerade gemerkt das es bedingt geht.... z.B Tab und Enter funktionieren, muss ich in der Dialogbox die Nachrichten anders abfangen, oder wie??

    gruss reima



  • reima schrieb:

    z.B Tab und Enter funktionieren

    ... und was funktioniert nicht?



  • flenders schrieb:

    reima schrieb:

    z.B Tab und Enter funktionieren

    ... und was funktioniert nicht?

    andere Tasten(z.b a, 1, 3, z, . ect) kann ich nicht abfangen, weder per WM_KEYDOWN, noch mit WM_GETDLGCODE



  • Schau dir mal WM_GETDLGCODE an 🙂



  • Es hat doch sicherlich ein Control auf deinem Dialog den Focus, und nicht der Dialog selbst. Also hilft Subclassing.



  • winapi. schrieb:

    Also hilft Subclassing.

    Eine Alternative dazu wäre eine eigene Art von IsDialogMessage() Funktion zu schrieben (Achtung: Pseudo-Code):

    IsDialogMessage(MSG msg) begin
      if msg.message == WM_KEYDON and msg.hwnd == Parent(hwndDialog) then
        msg.hwnd = hwndDialog; // alle Tastatureingaben an den Dialog leiten
      fi
    end
    

    So funktionieren allerdings sämtliche Eingaben in Kontrolls nicht mehr, also müssen da evtl noch ein paar mehr Bedingungen rein. TranslateMessage(&msg); und DispatchMessage(&msg); müssen danach natürlich noch aufgerufen werden.



  • D@niel $chumann schrieb:

    winapi. schrieb:

    Also hilft Subclassing.

    Eine Alternative dazu wäre eine eigene Art von IsDialogMessage() Funktion zu schrieben (Achtung: Pseudo-Code):

    IsDialogMessage(MSG msg) begin
      if msg.message == WM_KEYDON and msg.hwnd == Parent(hwndDialog) then
        msg.hwnd = hwndDialog; // alle Tastatureingaben an den Dialog leiten
      fi
    end
    

    So funktionieren allerdings sämtliche Eingaben in Kontrolls nicht mehr, also müssen da evtl noch ein paar mehr Bedingungen rein. TranslateMessage(&msg); und DispatchMessage(&msg); müssen danach natürlich noch aufgerufen werden.

    Danke für Idee, funktioniert Super, es ist in deiner Version ein Denkfehler enthalten und zwar bei der Bedingung:
    if(msg.hwnd == Parent(hwndDialog) //diese Bedinung ist nur war wenn das parrentwindow (in meinem fall Haupfenster) im vordergrund ist.
    deshalb ist die Bedinung wieder falsch fals der dialog im vordergrund ladet.

    Hier habe ich meine version, welche Die Keynachrichten nur an den dialogweiterlet wenn er im vordergrund ist:

    MSG IsDialogMessage(MSG msg)
    {
    	if((msg.message == WM_KEYDOWN)&&(play.GetPointer() == GetForegroundWindow()))
    	{
    
    		msg.hwnd = play.GetPointer();
    		return msg;
    	}
    	return msg;
    }
    

    gruss reima



  • Wenn dein Dialog nicht im Vordergrund ist bekommt er auch keine Eingabe-Nachrichten.

    Willst du Tasten Systemweit abfangen??



  • Oh, ja hast recht, ich meinte die Bedingung jedenfalls so:

    Parent(msg.hwnd) == hwndDialog // falls die Nachricht an ein Kind des Dialogs gehen soll
    


  • ?????????? schrieb:

    Wenn dein Dialog nicht im Vordergrund ist bekommt er auch keine Eingabe-Nachrichten.

    Willst du Tasten Systemweit abfangen??

    Dann bekommt die das Mainwindow die eingabenachrichten über, wo ist das problem?
    Wenn der Dialog nicht im vordergrund ist, dann braucht der dialog auch keine Keyboardmessages ---> die WindowProc fängt dann wie gewont die nachricht ab...

    Bei mir funktionierts jedenfalls

    gruss reima


Anmelden zum Antworten