Istnieje wiele sposobów na złapanie myszy lub klawiatury pod Windows. Wypróbowałem więc niektóre z nich, ale każdy ma pewne zalety i wady. Chcę Cię zapytać: z której metody korzystasz?
Próbowałem tych:
WM_KEYDOWN / WM_KEYUP - Główną wadą jest to, że nie mogę rozróżnić klawiszy lewych i praworęcznych, takich jak ALT, CONTROL lub SHIFT.
GetKeyboardState - rozwiązuje to problem pierwszej metody, ale jest nowa. Kiedy dostaję, że wciśnięty jest prawy ALT, również lewy klawisz Control jest wciśnięty. To zachowanie występuje tylko podczas korzystania ze zlokalizowanego układu klawiatury (czeski - CS).
WM_INPUT (Raw Input) - Ta metoda nie rozróżnia także klawiszy lewych i praworęcznych (o ile pamiętam) i dla ruchu myszy czasami generuje komunikat o zerowej wartości delta pozycji myszy.
Czy istnieje powód, dla którego nie można ich połączyć? Na przykład użyj WM_KEYDOWN do wykrycia naciśnięcia klawisza Ctrl / Alt / Shift, a następnie w ramach tego wywołania użyj GetKeyboardState (), aby odróżnić lewy od prawego?
źródło
WM_INPUT jest fajny. Myślę , że możesz odróżnić lewy / prawy klawisz za pomocą struktury RAWKEYBOARD . Trudną częścią może być zastanawianie się, jak radzić sobie z kluczowymi identyfikatorami (tj. Skancodami), ale nie mogę powiedzieć, ponieważ nigdy nie próbowałem używać tego do wprowadzania danych z klawiatury. WM_KEYDOWN jest takie proste :)
Jednak użyłem WM_INPUT do wprowadzania danych za pomocą myszy. To bardzo niski poziom. Nie ma zastosowanego przyspieszenia, co jest bardzo fajne (IMO). WM_INPUT był kiedyś jedynym sposobem na skorzystanie z ruchu myszy o wysokiej rozdzielczości, ale nie jestem pewien, czy nadal tak jest. Zobacz ten artykuł MSDN z 2006 roku .
DirectInput dla myszy / klawiatury jest wyraźnie odradzany przez Microsoft. Zobacz poprzednio połączony artykuł MSDN. Jeśli potrzebujesz joysticka, XInput jest prawdopodobnie najlepszym rozwiązaniem.
EDYCJA: Moje informacje na ten temat mogą być zbyt stare.
źródło
Właściwie, rozróżnij L / R Ctrl / Alt, kiedy złapiesz WM_KEYDOWN / WM_KEYUP, możesz. Łatwo, nie jest, ale kod, którego używam, tutaj możesz mieć, hmm hmm.
Mam nadzieję, że to nadal działa.
źródło
Możesz wypróbować interfejs API DirectInput , a ostatnio interfejs API XInput .
źródło