Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

WinApi wartość przesunięcia myszki na osi X/Y zamiast współrzędnych X/Y.

Ostatnio zmodyfikowano 2023-04-29 18:51
Autor Wiadomość
befejak
Temat założony przez niniejszego użytkownika
WinApi wartość przesunięcia myszki na osi X/Y zamiast współrzędnych X/Y.
» 2023-04-27 15:07:27
Witam,
 Chciałbym zapytać czy jest jakaś opcja aby uzyskać wartość przesunięcia myszki na X/Y w WinApi.
 Obecnie posiadam kod:
C/C++
case WM_MOUSEMOVE:
GetCursorPos( & WMouse );
Mouse.x = WMouse.x - WindowXPos;
Mouse.y = WMouse.y - WindowYPos;
break;

case WM_MOUSEWHEEL:
if( GET_WHEEL_DELTA_WPARAM( wParam ) > 0 ) {
   
Mouse.Wheel++;
   
Mouse.OnWheelUp();
} else {
   
Mouse.Wheel--;
   
Mouse.OnWheelDown();
} break;
Obie te rzeczy czytane są prawidłowo, program otrzymuje od Windows pozycję myszki na ekranie, ale zamiast tego
 chciałbym otrzymać coś podobnego do GET_WHEEL_DATA_WPARAM czyli wartość o jaką użytkownik poruszył myszkę.

Szukałem przez jakiś czas w dokumentacji Microsoft ale niczego nie mogę znaleźć co by mi na to pozwoliło :/...

Niby jest możliwość abym "teleportował" myszkę na drugi koniec ekranu jak to robią niektóre programy,
 ale w innym programie jak obraca się model 3D myszka potrafi zetknąć się z "ścianą" ekranu i pomimo że
 myszka "ruszyć" się dalej w np. lewo nie może to obiekt dalej się obraca.

Zależy mi na tym aby wiedzieć jak zostało to zrobione, pomimo że myszka styka się już z "ścianą" to jej "ruch" jest dalej odczytywany.
P-180114
DejaVu
» 2023-04-28 21:32:57
Odpowiedź z ChatGPT:
Tak, istnieje opcja uzyskania wartości przesunięcia myszki na osi X/Y w WinAPI. Możesz użyć funkcji GET_X_LPARAM i GET_Y_LPARAM do uzyskania wartości przesunięcia myszki na osi X i Y odpowiednio.

Poniżej przedstawiam przykładowy kod, który pozwoli Ci uzyskać wartość przesunięcia myszki na osi X/Y w funkcji obsługi zdarzenia WM_MOUSEMOVE:

C/C++
case WM_MOUSEMOVE:
{
   
int xPos = GET_X_LPARAM( lParam );
   
int yPos = GET_Y_LPARAM( lParam );
   
// tutaj możesz wykorzystać pozycję myszki na osiach X i Y
}
break;
Zwróć uwagę, że wartość przesunięcia myszki na osi X/Y jest uzyskiwana z parametru lParam przekazywanego do funkcji obsługi zdarzenia WM_MOUSEMOVE. Możesz wykorzystać funkcję GET_X_LPARAM i GET_Y_LPARAM do uzyskania odpowiednich wartości.
Czy ma sens - sprawdź.
P-180115
befejak
Temat założony przez niniejszego użytkownika
» 2023-04-29 15:35:53
Witaj DejaVu,
 Przetestowałem kod i niestety kompilator zwraca mi error "not declared in this scope"
 mam załączone Windows.h oczywiście, wszystko inne kompiluje się bez problemu.

Poszukałem w internecie na temat GET_X_LPARAM i znalazłem to:
https://cboard.cprogramming.com/windows-programming/69061-get_x_lparam-identifier-not-found.html

Zamieniając GET_X_LPARAM na LOWORD i GET_Y_LPARAM na HIWORD tak jak w temacie na forum powyżej
 program kompiluje się bez problemu ale cóż... zwraca współrzędne X / Y myszki na ekranie.

C/C++
case WM_MOUSEMOVE:
GetCursorPos( & WMouse );
qMouse.x = WMouse.x - WindowXPos;
qMouse.y = WMouse.y - WindowYPos;
qMouse.DeltaX = LOWORD( lParam );
qMouse.DeltaY = HIWORD( lParam );
break;

Niby jest to pewnien "upgrade" bo w ten sposób nie muszę już wzywać "GetCursorPos()" funkcji,
 więc tą funkcję mogę skasować i użyć LO/HIWORD, ale zależałoby mi dalej na tej delta X/Y.

Poczytałem również o GET_X_LPARAM i drugim w dokumentach Google:
https://learn.microsoft.com/en-us/windows/win32/api/windowsx/nf-windowsx-get_x_lparam

Ale nie mam pojęcia czemu kompilator nie widzi takiej funkcji...
 Kompiluję z użyciem 64 bitowego GCC 5.0.0 ( w CodeBlocks )


Znalazłem w internecie coś co chyba jest tym czego szukam ale nie działa...
https://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-rawinput

Windows ma w swojej dokumentacji "RawInput", ale za każdym razem jak próbuję stworzyć objekt typu RAWINPUTDEVICE
 mam ten sam error co z GET_X_LPARAM, RAWINPUTDEVICE not declared in this scope...


Znalazłem na GitHub-ie gotowca pokazującego przykładowe wykorzystanie RAWINPUT... ale się nie kompiluje...
https://gist.github.com/luluco250/ac79d72a734295f167851ffdb36d77ee


Próbowałem pobrać starszy kompilator ale również się nie kompiluje, czy jest szansa że to coś z moim Windowsem jest nie tak?
 Myślę że jakby RAWINPUT w końcu było widoczne dla kompilatora to by było to rozwiązanie którego poszukuję.

//Edit: mała poprawka literówek.
P-180116
DejaVu
» 2023-04-29 16:46:40
Zawsze możesz 'zapisać sobie' w zmiennych jaka była poprzednia pozycja myszki i obliczyć różnicę.
C/C++
case WM_MOUSEMOVE:
{
   
auto newPositionX = LOWORD( lParam );
   
auto newPositionY = HIWORD( lParam );
   
auto deltaX = newPositionX - Mouse.PositionX;
   
auto deltaY = newPositionY - Mouse.PositionY;
   
Mouse.PositionX = newPositionX;
   
Mouse.PositionY = newPositionY;
   
break;
}
Mouse to Twój jakiś 'globalny' obiekt, w którym trzymasz ostatnio znaną pozycję myszki.
P-180117
pekfos
» 2023-04-29 18:51:33
Powinno być GET_X_LPARAM/GET_Y_LPARAM.
https://learn.microsoft.com/en-us/windows/win32/api/windowsx/nf-windowsx-get_x_lparam
Header  windowsx.h (include Windowsx.h)
P-180118
« 1 »
  Strona 1 z 1