Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

1

22.01.2016, 22:11

[C++] Windows raw mouse input

Guten Tag du der dies hier gerade ließt.

Ich arbeite gerade an einem Programm, durch welches der Anwender den Mauszeiger auf eine Art weiteren virtuellen Bildschirm schieben können soll. Da Windows interne Funktion GetCursorPos() allerdings am Rand physikalischer Bildschirme aufhört muss ich den "raw input" der Maus lesen (über das WM_INPUT-Event). Dies klappt soweit auch ganz gut. Das Event wird getriggert wenn ich die Maus bewege und es lässt sich feststellen in welcher Richtung die Bewegung erfolgte. Jedoch habe ich Probleme die windowsinterne Pfeilphysik nachzuahmen. Laut dieser und dieser Seite hier muss ich die Anzahl der während einem Mausbusupdate erfolgten Bewegungen mit dem Quotienten der Mausbusupdaterate und der "Pointer resolution" multiplizieren, um so die Zeigergeschwindigkeit zu erhalten. Jedoch ist bei schnellen Bewegungen mit meinem momentanen Code die Geschwindigkeit = 0 (ich weiß nicht warum).

Hier sind die zwei wesentlichen Codeschnippsel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
case WM_INPUT:
        {
            UINT dwSize = 40;
            static BYTE lpb[40];
    
            GetRawInputData((HRAWINPUT)lParam, RID_INPUT, lpb, &dwSize, sizeof(RAWINPUTHEADER));
    
            RAWINPUT* raw = (RAWINPUT*)lpb;

            if(raw->header.dwType == RIM_TYPEMOUSE)
            {

                if (raw->data.mouse.lLastX == -1)
                {
                    MouseMovement.CountLeft++;
                }

                if (raw->data.mouse.lLastX == 1)
                {
                    MouseMovement.CountRight++;
                }

                if (raw->data.mouse.lLastY == -1)
                {
                    MouseMovement.CountUp++;
                }

                if (raw->data.mouse.lLastY == 1)
                {
                    MouseMovement.CountDown++;
                }


            }
        }


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
dt = Clock.restart().asSeconds();

        MousePosition.x += MouseVelocity.x;
        MousePosition.y += MouseVelocity.y;

        Time+=dt;

        if (Time >= 0.008)
        {

            int Right = MouseMovement.CountRight - MouseMovement.CountLeft;
            int Down = MouseMovement.CountDown - MouseMovement.CountUp;

            MouseVelocity.x = Right * 0.3 * 0.05; // Die 0.3 ergeben sich aus dem Quotienten;           
            MouseVelocity.y = Down * 0.3 * 0.05; // Die 0.05 habe ich als Faktor eingefügt um die Mausgeschwindigkeit zu reduzieren

            std::cout << MouseVelocity.x << " " << MouseVelocity.y << std::endl;

            Time = 0;

            MouseMovement.CountLeft = 0;
            MouseMovement.CountRight = 0;
            MouseMovement.CountUp = 0;
            MouseMovement.CountDown = 0;

        }

        SetCursorPos (MousePosition.x,MousePosition.y);


Vielen Dank für eure Zeit. :thumbsup:

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

2

23.01.2016, 00:12

raw->data.mouse.lLastX & lastY sind long und geben die Distanz an, die die Maus seit dem letzten Update in diese Richtung zurückgelegt hat. Durch die sehr hohen Update-Raten bewegen sich diese Werte bei niedriger Geschwindigkeit im bereich von -1 bis 1, aber bei höheren Bewegungsgeschwindigkeiten können sie auch größere Werte annehmen.
Du Prüfst in deinen abfragen aber nur explizit auf -1 und 1. Statt deine Counter zu Inkrementieren und Dekrementieren, müsstest du entsprechend den Wert der Mausbewegung addieren oder subtrahieren.

PS: Hier nochmal zur Referenz die Dokumentation: https://msdn.microsoft.com/de-de/library…8(v=vs.85).aspx

Swoerm

Alter Hase

  • »Swoerm« ist der Autor dieses Themas

Beiträge: 451

Wohnort: 127.0.0.1

  • Private Nachricht senden

3

23.01.2016, 11:25

Vielen, vielen, vielen Dank. :thumbsup:
Jetzt funktioniert es. Diese Abfragen stammen noch aus meinen ersten Tests un ich hatte vergessen sie zu erneuern. :dash:
Auf jeden Fall nochmals Danke. Manchmal übersieht man die einfachste Möglichkeit einfach. :rolleyes:

C-/C++-Quelltext

1
2
    /* Keep the compiler happy */
    return(0);

Werbeanzeige