DInput Mausabfrage



  • Hi,
    Ich hoffe, ich störe dieses "Grafik-verrückte" Forum nicht durch meine triviale Fragerei zu Direct Input. 😃
    Ich habe folgenden Code:

    hResult = lpDIMaus->GetDeviceState(sizeof(DIMOUSESTATE),(LPVOID) &ms);
    if(hResult == DIERR_INPUTLOST)
    {
      // Fehlerbehandlung/nochmal Acquire() blabla [..]
    }
    else 
    {
      if(hResult != DI_OK)  
         return FALSE;
    
      InputState.iMaus_X += ms.lX;
      InputState.iMaus_Y += ms.lY;
    
      if(ms.rgbButtons[0] & 0x80)
        InputState.bMaus_Buttons[0] = TRUE;
      else
        InputState.bMaus_Buttons[0] = FALSE;
    
      if(ms.rgbButtons[1] & 0x80)
      {
        InputState.bMaus_Buttons[1] = TRUE;  //*
        MessageBeep(-1);
      }
      else
        InputState.bMaus_Buttons[1] = FALSE;
    

    Stimmt doch alles, ne ? Gut, mein MausObjekt wird beim Beenden der Anwendung wie folgt gekillt

    if(lpDIMaus != NULL)
    {
      lpDIMaus->Unacquire();
      lpDIMaus->Release();
      lpDIMaus = NULL;
    }
    

    InputState ist eine Programmeigene Struktur. Jedenfalls wird meine Anwendung beendet, sobald der Benutzer die rechte Maustaste drückt. Start ich nun das Programm und drücke dir rechte Maustaste, beendet es normal. Starte ich dann aber nochmal, beendet es sofort, obwohl ich die Maustaste garnicht drücke - die Taste ist also noch von dem Programmaufruf vorher gedrückt (scheint zumindest so). Ist das normal bei DirectInput dass GetDeviceState() falsche Daten zurückliefert ??? Oder muss ich das Programm anders beenden, bzw. die Maus anders abfragen (bitte nicht gepuffert!) ? 😕
    Ich hab schon mit nem MessageBeep rausgefunden, dass er tatsächlich in diese (//*) Zeile springt, wenn ich das Programm starte und es dann gleich beendet.

    Danke,
    Joachim



  • Die Frage stört hier nicht, warum auch...

    Hast du mal daran gedacht, das es einen anderen Fehlercode als DIERR_INPUTLOST geben könnte? Ansonsten müsste es eigentlich funktionieren, normalerweise sollte DI eigentlich keinen falschen Maustastendruck melden, unabhängig ob gebuffert oder nicht. Normalerweise würde es aber auch nicht grossartig auffallen.



  • Naja, ich springe doch mit

    if(hResult!=DI_OK)
      return FALSE;
    

    raus, wenn was nicht stimmt -- und es stimmt ja alles (hResult == DI_OK), sonst wär er nicht zum MessageBeep gesprungen. Ich find das seltsam, aber anscheinend hab ich nichts falsch gemacht...
    Joachim



  • Naja wäre möglich, das DI (oder der Treiber?) intern sich irgendeinen State merkt und der noch nicht zurückgesetzt ist. Waren das denn jetzt die debug libaries und wurde alles korrekt released?



  • Ich hab bisher mit den debug Bibliotheken gearbeitet.
    Aber ist egal, das ganze war eh nur ein Testprogramm. Ich hab den rechten Knopf für was anderes benutzt und dann ging alles - es scheint wohl so zu sein, dass wirklich nur einmal ein falscher Wert kommt und dann bei der nächsten Abfrage ists wieder ok. Trotzdem komisch...
    Joachim


Anmelden zum Antworten