Hilfe! GetKeyState geht nicht.



  • Hallo. Ich habe im Timer (100ms als Interval) folgenden Code zu stehen:

    if (GetKeyState(VK_UP))
    //...
        if (GetKeyState(VK_DOWN))
    //...
        if (GetKeyState(VK_LEFT))
    //...
        if (GetKeyState(VK_RIGHT))
    //...
    


  • Sorry, hab ich versehentlich zu früh abgeschickt. Also:

    Es funktioniert nicht: Auch wenn ich die Tasten nicht drücke, macht er das, was dort drin steht (nur eine Zeile). Ich habs auch schonmal mit if (GetKeyState(...)==1) //... probiert, er macht aber auch dort alles das, was dort drin steht.



  • hatte das Problem letztlich auch mal.
    Versuch mal ob es so geht.

    if (HIWORD(GetKeyState(VK_DOWN)) == 1 ) // bei 1 taste gedrückt , bei 0 nicht
    //...
    

    ist nur eine Vermutung bin mir nicht wirklich sicher ohne nachzuschlagen.

    Gruß wastman



  • warum benutzt du nicht einfach das OnKeyPress oder das OnKeyDown ereignis? 😕



  • Nun, wenn ich das so mache, dann macht er einmal was, wartet einen Moment und dann bearbeitet er den Code wie in einer Endlosschleife. Damit das geregelter wird wollt ich das im Timer machen. Und im Übrigen funzt bei mir auch das nicht:

    if (HIWORD(GetKeyState(VK_DOWN))==1) //...
    

    Jetzt macht er nämlich garnix mehr.



  • hmm, OnKeyDown bearbeitet den code sofort, versteh nicht warum er da bei dir warten soll

    wenn du KeyPreview von der form auf true setzt solltest du eigentlich alle tastatureingaben sofort abfangen können (und dass auch ohne verzögerung)

    wenn ich im OnKeyDown folgensess schreibe funzt dass wunderbar:

    switch(Key)
     { case VK_UP:    Edit1->Text = "Oben";   break;
       case VK_DOWN:  Edit1->Text = "Unten";  break;
       case VK_LEFT:  Edit1->Text = "Links";  break;
       case VK_RIGHT: Edit1->Text = "Rechts"; break;
     }
    


  • Gut, jetzt nimm nen Label und schreib im onKeyDown-Ereignis folgendes:

    if (Key=="VK_DOWN") Label1->Top+=2;
    

    Na, fällt dir jetzt die Verzögerung auf?



  • Sorry, VK_DOWN natürlich ohne Anführungsstriche 🙂



  • meinst du die tastenwiederholungsverzögerung (geiles wort 😃 ) bei gedrückter taste?



  • falls du die tastaturwiederholungsverzögerung meinst, würde folgendes abhilfe schaffen:

    WORD Taste;
    
    void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift)
    {
        Taste = Key;
    }
    
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift)
    {
        Taste = NULL;
    }
    
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
        switch(Taste)
            { case VK_UP:    Label1->Top-=2;  break;
              case VK_DOWN:  Label1->Top+=2;  break;
              case VK_LEFT:  Label1->Left-=2; break;
              case VK_RIGHT: Label1->Left+=2; break;
            }
    }
    


  • Und was, wenn es mehrere Tasten sind? Was, wenn er beim Autorennen z.B. (sehr beliebtes Beispiel) Gas geben muss und lenken? Ich würd das so machen:

    bool U=false, D=false, L=false, R=false;
    void TForm1::FormKeyDown (TObject *Sender, WORD &Key, TShiftState Shift)
    {
       switch (Key)
       {
          case VK_UP: U=true;
          break;
          case VK_DOWN: D=true;
          break;
          case VK_LEFT: L=true;
          break;
          case VK_RIGHT: R=true;
       }
    }
    void TForm1::FormKeyUp (TObject *Sender, WORD &Key, TShiftState Shift)
    {
       switch (Key)
       {
          case VK_UP: U=false;
          break;
          case VK_DOWN: D=false;
          break;
          case VK_LEFT: L=false;
          break;
          case VK_RIGHT: R=false;
       }
    }
    void TForm1::Timer1Timer(TObject *Sender)
    {
       if (U) //...
       if (D) //...
       if (L) //...
       if (R) //...
    }
    


  • Danke Windoof, das funktioniert prima!


Log in to reply