Nieprzetworzone dane wejściowe — przegląd
Istnieje wiele urządzeń wejściowych użytkownika obok tradycyjnej klawiatury i myszy. Na przykład dane wejściowe użytkownika mogą pochodzić z ekranu dotykowego, mikrofonu lub innych urządzeń, które zapewniają dużą elastyczność w danych wejściowych użytkownika. Te urządzenia są wspólnie nazywane urządzeniami interfejsu człowieka (HID). Interfejs API danych wejściowych zapewnia stabilny i niezawodny sposób przyjmowania surowych danych wejściowych z jakiegokolwiek urządzenia HID, w tym klawiatury i myszy.
W tej sekcji omówiono następujące tematy:
- nieprzetworzony model wejściowy
- rejestracja nieprzetworzonych danych wejściowych
- odczytywanie nieprzetworzonych danych wejściowych
Nieprzetworzony model wejściowy
Wcześniej klawiatura i mysz zwykle wygenerowały dane wejściowe. System zinterpretował dane pochodzące z tych urządzeń w sposób, który wyeliminował szczegóły specyficzne dla urządzenia dotyczące nieprzetworzonych informacji. Na przykład klawiatura generuje kod skanowania specyficznego dla urządzenia, ale system udostępnia aplikacji kod klucza wirtualnego. Oprócz ukrywania szczegółów surowych danych wejściowych, menedżer okien nie obsługiwał wszystkich nowych urządzeń HID. Aby uzyskać dane wejściowe z nieobsługiwanych urządzeń HID, aplikacja musiała wykonać wiele czynności: otworzyć urządzenie, zarządzać trybem udostępnionym, okresowo odczytywać urządzenie lub konfigurować port uzupełniania we/wy itd. Opracowano pierwotny model danych wejściowych i skojarzone interfejsy API, aby umożliwić prosty dostęp do nieprzetworzonych danych wejściowych ze wszystkich urządzeń wejściowych, w tym klawiatury i myszy.
Pierwotny model wejściowy różni się od oryginalnego modelu danych wejściowych systemu Windows dla klawiatury i myszy. W oryginalnym modelu wejściowym aplikacja odbiera dane wejściowe niezależne od urządzenia w postaci komunikatów wysyłanych lub publikowanych w oknach, takich jak WM_CHAR, WM_MOUSEMOVEi WM_APPCOMMAND. Natomiast w przypadku nieprzetworzonych danych wejściowych aplikacja musi zarejestrować urządzenia, z których chce pobierać dane. Ponadto aplikacja pobiera nieprzetworzone dane wejściowe za pośrednictwem komunikatu WM_INPUT.
Istnieje kilka zalet nieprzetworzonego modelu danych wejściowych:
- Aplikacja nie musi wykrywać ani otwierać urządzenia wejściowego.
- Aplikacja pobiera dane bezpośrednio z urządzenia i przetwarza dane pod kątem swoich potrzeb.
- Aplikacja może odróżnić źródło danych wejściowych, nawet jeśli pochodzi z tego samego typu urządzenia. Na przykład dwa urządzenia wskazujące.
- Aplikacja zarządza ruchem danych, określając dane z kolekcji urządzeń lub tylko określone typy urządzeń.
- Urządzenia HID mogą być używane w miarę ich dostępności na rynku, bez oczekiwania na nowe typy komunikatów ani na zaktualizowany system operacyjny pozwalający na nowe polecenia w WM_APPCOMMAND.
Należy pamiętać, że WM_APPCOMMAND zapewnia niektóre urządzenia HID. Jednak WM_APPCOMMAND to zdarzenie wejściowe niezależne od urządzenia wyższego poziomu, a WM_INPUT wysyła nieprzetworzone, niskie dane specyficzne dla urządzenia.
Rejestracja dla nieprzetworzonych danych wejściowych
Domyślnie żadna aplikacja nie odbiera nieprzetworzonych danych wejściowych. Aby otrzymywać nieprzetworzone dane wejściowe z urządzenia, aplikacja musi zarejestrować urządzenie.
Aby zarejestrować urządzenia, aplikacja najpierw tworzy tablicę RAWINPUTDEVICE struktury, które określają kolekcji najwyższego poziomu (TLC) dla żądanych urządzeń. TLC jest definiowany przez stronę użycia (klasę urządzenia) i identyfikator użycia (urządzenie w klasie). Aby na przykład uzyskać klawiaturę TLC, ustaw wartość UsagePage = 0x01 i UsageID = 0x06. Aplikacja wywołuje RegisterRawInputDevices w celu zarejestrowania urządzeń.
Należy pamiętać, że aplikacja może zarejestrować urządzenie, które nie jest obecnie dołączone do systemu. Po dołączeniu tego urządzenia Menedżer systemu Windows automatycznie wyśle nieprzetworzone dane wejściowe do aplikacji. Aby uzyskać listę nieprzetworzonych urządzeń wejściowych w systemie, aplikacja wywołuje GetRawInputDeviceList. Korzystając z hDevice z tego wywołania, aplikacja wywołuje GetRawInputDeviceInfo, aby uzyskać informacje o urządzeniu.
Za pośrednictwem dwFlags członka struktury RAWINPUTDEVICEaplikacja może wybrać urządzenia do nasłuchiwania, a także urządzenia, które chce zignorować. Na przykład aplikacja może poprosić o dane wejściowe ze wszystkich urządzeń telefonii, z wyjątkiem maszyn do odpowiadania. Aby uzyskać przykładowy kod, zobacz Registering for Raw Input.
Należy pamiętać, że mysz i klawiatura są również HID, więc dane z nich mogą pochodzić zarówno przez komunikat HID WM_INPUT, jak i z tradycyjnych komunikatów. Aplikacja może wybrać jedną z metod poprzez odpowiedni dobór flag w RAWINPUTDEVICE.
Aby sprawdzić stan rejestracji aplikacji, wywołaj GetRegisteredRawInputDevices w każdej chwili.
Odczytywanie nieprzetworzonych danych wejściowych
Aplikacja odbiera nieprzetworzone dane wejściowe z dowolnego urządzenia HID, którego kolekcja najwyższego poziomu (TLC) pasuje do TLC z rejestracji. Gdy aplikacja odbiera nieprzetworzone dane wejściowe, kolejka komunikatów otrzymuje komunikat WM_INPUT, a flaga stanu kolejki QS_RAWINPUT jest ustawiona (QS_INPUT zawiera również tę flagę). Aplikacja może odbierać dane, gdy znajduje się na pierwszym planie i kiedy znajduje się w tle.
Istnieją dwa sposoby odczytywania danych pierwotnych: metoda unbuffered (lub standardowa) i metoda buforowana. Metoda unbuffered pobiera nieprzetworzone dane jeden RAWINPUT struktury jednocześnie i jest odpowiedni dla wielu HID. W tym miejscu aplikacja wywołuje GetMessage w celu pobrania komunikatu WM_INPUT. Następnie aplikacja wywołuje GetRawInputData, używając uchwytu RAWINPUT zawartego w WM_INPUT. Aby zapoznać się z przykładem, zobacz Wykonywanie standardowego odczytu nieprzetworzonych danych wejściowych.
Natomiast metoda buforowana pobiera tablicę struktur RAWINPUT jednocześnie. Jest to dostępne dla urządzeń, które mogą generować duże ilości nieprzetworzonych danych wejściowych. W tej metodzie aplikacja wywołuje GetRawInputBuffer, aby uzyskać tablicę struktur RAWINPUT. Pamiętaj, że makro NEXTRAWINPUTBLOCK służy do przechodzenia przez tablicę struktur RAWINPUT. Aby zapoznać się z przykładem, zobacz Wykonywanie buforowanego odczytu nieprzetworzonych danych wejściowych.
Aby zinterpretować nieprzetworzone dane wejściowe, wymagane są szczegółowe informacje o hidach. Aplikacja pobiera informacje o urządzeniu, wywołując GetRawInputDeviceInfo z uchwytem urządzenia. Ten uchwyt może pochodzić z WM_INPUT lub z hDevice składowej RAWINPUTHEADER.