WinApi wartość przesunięcia myszki na osi X/Y zamiast współrzędnych X/Y.
Ostatnio zmodyfikowano 2023-04-29 18:51
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: 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. |
|
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: case WM_MOUSEMOVE: { int xPos = GET_X_LPARAM( lParam ); int yPos = GET_Y_LPARAM( lParam ); } 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ź. |
|
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.htmlZamieniają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. 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_lparamAle 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-rawinputWindows 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/ac79d72a734295f167851ffdb36d77eePró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. |
|
DejaVu |
» 2023-04-29 16:46:40 Zawsze możesz 'zapisać sobie' w zmiennych jaka była poprzednia pozycja myszki i obliczyć różnicę. 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. |
|
pekfos |
» 2023-04-29 18:51:33 |
|
« 1 » |