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.