Fehler bei Tastatureingaben



  • Hi Leute,
    Ich hoffe, ihr könnt mir helfen. Ich belese mich gerade zur WinApi und möchte gerne ein wenig mit Tastatureingaben arbeiten. Meine WndProc funktion sieht wie folgt aus:

    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    static RECT windowSize;
    static bool bArrowKeys[4];
    bool bValidKeyPressed = false;
    
    if(message == WM_SIZE)
      {
      windowSize.left    = 0;
      windowSize.top     = 0;
      windowSize.right   = LOWORD(lParam);
      windowSize.bottom  = HIWORD(lParam);
      }
    else if(message == WM_KEYDOWN)                                  //37 = linke Pfeiltaste
      {
      for(int i = 37; i <= 40; ++i)
        {
        if(wParam == i)
          {
          bArrowKeys[i - 37] = true;
          bValidKeyPressed = true;
          }
        }
      if(!bValidKeyPressed)
        {
        InvalidateRect(hWnd, NULL, false);
        }
      }
    else if(message == WM_KEYUP)
      {
      for(int i = 37; i <= 40; ++i)
        {
        if(wParam == i)
          {
          bArrowKeys[i - 37] = 0;
          bValidKeyPressed = true;
          }
        }
      if(!bValidKeyPressed)
        {
        InvalidateRect(hWnd, NULL, false);
        }
      }
    else if(message == WM_PAINT)
      {
      PAINTSTRUCT paintStruct;
    
      paintStruct.hdc = BeginPaint(hWnd, &paintStruct);
        {
        char  szText[40];
        int   iStrLen    = 0;
        SIZE  size;
    
        for(int i = 0; i < 4; ++i)
          {
          iStrLen = wsprintf(szText, "Status der Taste %i: %i", i, bArrowKeys[i]);
    
          GetTextExtentPoint32(paintStruct.hdc, szText, iStrLen, &size);
    
          TextOut(paintStruct.hdc, windowSize.right / 2 - size.cx / 2, windowSize.bottom / 2 -
                        2 * size.cy + i * size.cy, szText, iStrLen);
    
          }
        }
      EndPaint(hWnd, &paintStruct);
      }
    else if(message == WM_CLOSE)
      {
      PostQuitMessage(0);
      }
    else
      {
      return DefWindowProc(hWnd, message, wParam, lParam);
      }
    
    return 0;
    }
    

    Wenn ich die linke Pfeiltaste drücke lautet die Ausgabe wie folg:

    Status der Taste 0: 0
    Status der Taste 1: 0
    Status der Taste 2: 0
    Status der Taste 3: 0
    

    Wenn ich irgendwie auf der linken Pfeiltaste + Strg rumhacke:

    Status der Taste 0: 1
    Status der Taste 1: 0
    Status der Taste 2: 0
    Status der Taste 3: 0
    

    Wenn ich wieder loslasse:

    Status der Taste 0: 1
    Status der Taste 1: 0
    Status der Taste 2: 0
    Status der Taste 3: 0
    

    Irgendwie verstehe ich nicht, warum ich diese Ausgaben bekomme 😞 .

    MfG
    DragonRaider


  • Mod

    bValidKeyPressed wird jedes mal bei jeder neuen Nachricht frisch initialisiert.

    Lerne noch etwas C/C++ Grundlagen.



  • Hi,
    Das wusste ich. Wo ist das Problem? Ich will doch auch nur die Tastatureingabe DIESER EINEN Nachricht überprüfen...
    MfG
    DragonRaider

    PS.: Selbst wenn ich deinen Vorschlag umsetze, ändert sich nichts.



  • Nein, du sollstest Grundlagen lernen ...

    Wenn du einen Knopf drückst, wird die bool Variable erzeugt und ggf. mit true belegt, je nach gedrückter Taste. Wenn die WM_PAINT nachricht jedoch gesendet wird (in der du die Ausgabe machen möchtest, welche Taste gedrückt wurde / wird), wird die bool Variable WIEDER neu erzeugt und somit alles auf false gesetzt. Die Tastedrücke sind bei der WM_PAINT also alle auf false gesetzt.

    Wenn du deinen Code nicht verändern möchtest, müsstest du die bool Variable Global setzen und dafür sorgen, das auch ein loslassen der jeweiligen Taste erkannt wird, damit diese wieder auf false gesetzt wird.

    Wenn der Herr Richter etwas sagt, solltest du das ernst nehmen, der Mann weiß was er hier schreibt ...

    Gruß
    Ombre



  • Schmeiss die Variable bValidKeyPressed einfach raus 😉



  • Ombre schrieb:

    Nein, du sollstest Grundlagen lernen ...

    Schau Dir die Grundlagen gleich mit an 😉
    Der Code stimmt, nur wann "InvalidateRect" aufgerufen wird eben nicht.



  • Hi,
    Danke für eure Hilfe. Ich habe die Funktion von "InvalidateRect" einfach falsch verstanden(hab nicht drüber nachgedacht). Wenn ich das jetzt richtig verstanden hab erklärt InvalidateRect einen bestimmten Bereich von Hand für "Update bedürftig", was dann ein WM_PAINT "Event" auslC++ IT-Tutorialst.
    Mein Fehler lag jedoch darin, dass ich dachte, dass man mit InvalidateRect Windows zu verstehen gibt, dass dieser Tastendruck von meinem Programm nicht verarbeitet wird... Keine Ahnung, wie ich da drauf gekommen bin 😉 . D.h.: Das Programm ist meiner Logik gefolgt, bis darauf, was InvalidateRect tut.

    Nichts desto Trotz bekomme ich oft an den Kopf geknallt, ich würde die Grundlagen nicht beherrschen(z.B. auch, als ich indirekt nach Pipes gefragt habe). Da wurde mir das Buch "The C++ Programming Language" ans Herz gelegt. Doch gerade habe ich hier auf der Startseite noch das Buch "C++ IT-Tutorial" entdeckt. Was sagt ihr?

    MfG
    DragonRaider



  • es ist ein tutorial und kein book!



  • OK, sry. Mein Fehler.
    ---CLOSED---


Anmelden zum Antworten