Tastendruck in dialogbox



  • guten nachmittag.

    Ich habe irgenwie Probleme beim abfangen des Tastendrucks in der Dialogbox...

    habe es so gemacht wie es in der MSDN steht.

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

    play.GetPointer() ist der Handle der dialogbox.....

    in der dialogbox hab ich es einfach so auferufen:

    case WM_KEYDOWN:
    		MessageBox(0,"ddd","ddd",0);
    		break;
    

    aber Er reagiert immer noch nicht auf den Tastendruck, hab ich was vergessen oder falsch gemacht

    Edit: die IsDialogMessage funktion gibt zwar 1 zurück, aber irgendwie kann ich die Nachrichten nicht abfangen....

    weder mit WM_KEYDOWN, noch mit WM_GETDLGCODE

    gruss reima



  • So wie du das geschrieben hast, wird IsDialogMessage wohl praktisch gar nicht aufgerufen, da GetMessage ja erst zurückkehrt, wenn eine Message da ist, und dann ist die Bed. schon true - packe also IsDialogMessage mal lieber in den while-Block 🙂



  • hab ich gemacht, bringt aber nichts.... 🙄

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

    }



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


  • 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