Anfänger: Tastaturnachrichten bei Dialogen



  • Ich muß mich wohl gleich im vorhinein entschuldigen: Selbst nach kräftezerrendem Durchblättern des "Petzolds" und Rumgeklicke in der MSDN bekomme ich eine, an sich simple Frage, nicht beantwortet:

    Ich habe einen ganz gewöhnlichen modalen Dialog. Dieser beinhaltet unter anderen ein Eingabefeld (EDIT-Control).
    Sobald der Anwender nun einen Text dort eingibt und mit Enter bestätigt würde ich gerne eine Nachricht in der Dialogprozedur behandeln.

    Nun sind bei Dialogprozeduren ja nur wenige Systemnachrichten erlaubt bzw. werden versorgt, was mir Kopfzerbrechen bereitet.

    Das müßte der Ansatz sein um sich auf die Nachrichten des Eingabefeldes zu beschränken:

    case WM_COMMAND:
    			if (LOWORD(wParam) == IDC_Eingabe) 
    			{
    				...
    				return TRUE; 
    			}
    

    Allerdings weiß ich nun nicht wie ich die Eingabetaste abfragen soll.
    In der MSDN unter "Dialog Box Programming Considerations" gibt es zwar Tips für spezielle Tastencodes aber keine allgemeine Erklärung.

    Den Edit-Style ES_WANTRETURN für das Eingabefeld habe ich bei der Erzeugung mitangegeben.



  • Kannst die WM_KEYDOWN message "umleiten" auf die Dialogbox, ich habs so gemacht als ich die Tasten in der Konsole abfangen wollte:

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

    play.GetPointer ist das handle der Dialogbox, Dabei ist zu beachten das nur tastennachrichten an die Dialogbox gesendet werden, wenn die dialogboxim vordergrund ist

    dies dann normal in die Hauptnachrichenschleife einbauen.

    while(GetMessage(&msg,NULL,0,0))
    {
            msg = IsDialogMessage(msg);
            TranslateMessage(&msg);
            DispatchMessage(&msg);
    }
    

    und dann kannst du in der Dialogboxprocedur normal die Keys abfangen:

    switch(message)
    {
    case WM_KEYDOW:
    if(wParam == VK_RETURN )MessageBox(0,"die taste enter wurde gedrückt",0);
    }
    

    gruss reima



  • Vielen Dank, reima !

    Ich habe es wie von dir beschrieben eingebaut und es hat auf Anhieb funktioniert.

    Mich wundert nur, das es über diesen Umweg geschehen muß. Gibt es dazu keine standardisierte Vorgehensweise?

    Denn intuitiv würde ich sagen, das Dialogprozeduren schon standardmäßig die Tastaturcodes erhalten sollen und nur im Falle der Nichtbearbeitung an die WndProc übergeben werden sollte. Gibt es dafür einen Grund, das ist nun nicht so ist?



  • Normalerweise hat man einen Ok-Button der beim Drücken der Enter-Taste dann ausgelöst wird, weil er der Default-Pushbutton ist.



  • Wenn du nur die Standardkeys willst ( ENTER, TAB, ect) dann reicht meistens das du IsDialogMessage(hDlg,&msg); aus der api verwendest,
    diese funktion gibt bei erfolg 1 amsonsten 0 zurück. TranslageMessage und DispatchMessage müssen dann icht mehr aufgerufen werden.

    while(GetMessage(&msg,NULL,0,0))
    {
            if(IsDialogMessage(handleDesDialogs,&msg != 0)
            {
                  TranslateMessage(&msg);
                  DispatchMessage(&msg);
            }
    }
    

Anmelden zum Antworten