Auf Tastendruck warten??



  • Hi
    ich hab folgenden code:

    bool       setcharinput, //Wen true, dann wird inhalt von WM_CHAR ausgeführt
               inputsuccess; //Wenn true, wurde Taste gedrückt
    char       inputvalue;
    
    LRESULT CALLBACK WindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
     //...  
      case WM_CHAR: {
                     MessageBox(NULL,"WM_CHAR","",MB_OK);
                     if(setcharinput)
                     {
                      MessageBox(NULL,"WM_CHAR _INPUT","",MB_OK);
                      inputvalue = wParam;
                      setcharinput=false;
                      inputsuccess=true;
                     }
                     else inputsuccess=false;
                    }break;
     //...
    }
    
    bool input(char* value)
    {
     inputsuccess = false;
     setcharinput = true; //Eingabe freigeben
    
        //Was hier machen??
    
     *value = inputvalue; //Zeichen einlesen
     return inputsuccess;
    }
    

    Wie kann ich jetzt, nachdem ich die eingabe freigegeben habe, warten, bis eine Taste gedrückt wurde??
    Wenn ich da while(setcharinput); Hinmache, ist das Programm nicht mehr zu bedienen (Sanduhr-cursor wird angezeigt)

    ps.: Wie kann ich auf die hinteren Zeichen einer Schriftart zugreifen?? (z.B. Bei "Courier New" die Ganzen Linien und ecken, die ich auch in der Konsole zur verfügung habe??)



  • Hmm bin mir nicht ganz sicher

    Du müsstest das WM_CHAR nochmal innerhalb der Windowsmessage
    WM_KEYDOWN einschachtel oder ersetz doch_mal das WM_CHAR gegen WM_KEYDOWN
    WM_KEYDOWN sollte alles was von der Tastatur kommt abfangen.
    Wenn das geht kannst du dich weiter vorarbeiten.

    Gruss sclearscreen 🙂



  • Welche Taste gedrueckt worden ist ist im übrigen in eimem der zwei Parameter

    WPARAM wParam
    

    bzw.

    LPARAM lParam
    

    .

    enthalten. Nachdem WM_KEYDOWN bzw. WM_CHAR eingetreten ist!
    Musst aber mal weiter in der MSDN nachsuchen, hatte lange mehr nichtsmehr am Hut
    mit WinAPI!

    Grüsse 👍



  • sorry habe deinen Post flasch verstanden, stelle ich gerade fest! Soory!

    Aber jetzt:

    bool input(char* value)
    {
     inputsuccess = false;
     setcharinput = true; //Eingabe freigeben
    
        //Was hier machen??
    
     *value = inputvalue; //Zeichen einlesen
     return inputsuccess;
    }
    

    Wenn Du bei:

    //Was hier machen??
    

    Die Tastaur sperren willst nur um auf einen Tastendruck zu warten
    verstösst Du gegen den Nachrichtenbehandlungsmechanismus von Windows,
    Dann blockierst Du deine gesamte Anwendung, das geht nicht kein Wunder
    wenn eine Sanduhr kommt!!!!!!!!!!!!!!!!!!!!!!!!!!
    🙂 Du blockierst Windows damit in folgender Sache

    while (GetMessage (&messages, NULL, 0, 0))
        {
            /* Translate virtual-key messages into character messages */
            TranslateMessage(&messages);
            /* Send message to WindowProcedure */
            DispatchMessage(&messages);
        }
    

    Mit freundlichen Gruessen 👍



  • weil deine Anwendung dann eben in deiner selbstgeschriebenen Routine
    hängenbleibt 🙂 😉



  • Du sollteswt dir bei eintreffen von WM_KEYDOWN oder wie bei dir bei WM_CHAR,
    in einer statischen Variablen merken das jetzt Tastaureigaben gemacht werden
    um dann den Parameter

    lParam
    

    auf fuer dich relevante Tasten prüfen!

    Hinweis: Bau wenn es geht keine Schleifen in Hauptnachrichtenbehandlungroutinen
    von Fenstern ein! Wenn Du schleifen einbaust dann sei dir genau über deren
    Abbruchbedingung im Klaren!!!!

    🙂 👍



  • Hier damit kannst die Taste anzeigen die gedrückt wird!

    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
        static TCHAR key[2];
        switch (message)                  /* handle the messages */
        {
            case WM_DESTROY:
                PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
                break;
    
            case WM_CHAR:
                GetKeyNameText(lParam,key,sizeof(key)/sizeof(TCHAR));
                MessageBox(0,key,"Taste",0);
                break;
    
            default:                      /* for messages that we don't deal with */
                return DefWindowProc (hwnd, message, wParam, lParam);
        }
    
        return 0;
    }
    

    habs mal in meine Compiler getestet, ich denke darauf kannste weiter aufbauen!

    Mit besten Gruessen! Passe Deine Code entsprechend an wie Du möchtest!



  • Aber das mit den Schleifen in der Fensterprozedur meine ich immer noch so ernst!
    Diesen Ratschlag bitte beherzigen!
    Sonst kommt die Sanduhr öfters mal weil Deine Anwendung dann keine Zeit fuer Dich hat! 🙂 😉


Anmelden zum Antworten