Załóżmy, że pod komputer mam podłączony gamepad, urządzenie i połączenie są prawidłowe;
W programie, za pomocą funkcji joyGetDevCaps pobieram informacje na temat urządzenia, wypełniając strukturę typu JOYCAPS; W niej znajdują się różne informacje, ale nas interesują pola wXmax i wYmax, czyli maksymalne wartości dla dwóch głównych osi; Na moim gamepadzie, osie X i Y określają pozycję D-Pada (krzyżyka);
Podczas rozruchu aplikacji, rejestruję przechwytywanie kominikatów od gamepada dla głównego okna programu - używam funkcji joySetCapture, podając uchwyt tegoż okna; Natomiast podczas zamykania programu, zwalniam "słuchacza" funkcją joyReleaseCapture, sprzątając po sobie (choć nie jest to konieczne, jeśli robi się to przy zamykaniu całego programu); Taki zabieg pozwoli na obsługę komunikatów przez okno - można sobie napisać metody obsługi np. komunikatów MM_JOY1BUTTONDOWN; Ale nie chcę ich używać, bo są mocno ograniczone (cztery przyciski to mało);
Dlatego też stan gamepada odczytuję w timerze, pobierając dane z pada za pomocą funkcji joyGetPosEx, wypełniając strukturę typu JOYINFOEX, aby mieć komplet danych; I faktycznie tak się dzieje - dane są prawidłowe; Stan osi X i Y (czyli położenia D-Pada) określają trzy możliwe wartości:
-
0x0000
- minimum (góra i/lub lewo), -
0x7FFF
- środek, -
0xFFFF
- maksimum (dół i/lub prawo);
I teraz tak - teoretycznie, skoro nie obsługuję komunikatów płynących do okna, nie potrzebuję wywoływać funkcji joySetCapture; Stan gamepada sprawdzany jest cyklicznie przez timer; Tutaj pojawia się problem - jeżeli nie wywołam tej funkcji, wartości dla dwóch głównych osi będą jednobajtowe, a dokładniej takie jak poniżej: -
0x0000
- minimum (góra i/lub lewo), -
0x007F
- środek, -
0x00FF
- maksimum (dół i/lub prawo);
W dalszym ciągu timer pobiera dane z urządzenia, funkcje nie zwracają błędów, ale wartości są okrojone/mniej precyzyjne; A co jeszcze dziwniejsze, jeżeli mając aktywne główne okno programu trzymam lewyAlt
, to na czas trzymania wciśniętego tego klawisza, wartości są dwubajtowe, a jak go puszczę to znów jednobajtowe; Nie wiem dlaczego, ale śmiesznie to działa :]
Podsumowując:
- skoro dane z pada pobieram przez timer to dlaczego mimo wszystko muszę wywołać funkcję joySetCapture, aby otrzymywać prawidłowe, dwubajtowe wartości stanu osi?
- skoro funkcja joyGetDevCaps wypełnia pola wXmax i wYmax wartościami
0xFFFF
(dla maksimum), to dlaczego joyGetPosEx wypełnia te pola wartościami0x00FF
(też dla maksimum)?
Dzięki za ewentualne zainteresowanie;
Edit: Dodam może, żeby wszystko było jasne; Póki co nie widzę problemu, aby wywoływać funkcje joySetCapture i joyReleaseCapture - ich wywołanie w niczym nie przeszkadza; Chciałbym jedynie wiedzieć, dlaczego bez wywołania tej pierwszej funkcji, otrzymywane wartości dla osi są o połowę mniej precyzyjne.