Sdílet prostřednictvím


Přehled nezpracovaných vstupů

Kromě tradiční klávesnice a myši existuje mnoho uživatelských vstupních zařízení. Uživatelský vstup může například pocházet z joysticku, dotykové obrazovky, mikrofonu nebo jiných zařízení, která umožňují velkou flexibilitu vstupu uživatele. Tato zařízení se souhrnně označují jako HID (Human Interface Devices). API pro přímý vstup poskytuje stabilní a robustní způsob, jak aplikace přijímat syrový vstup z jakéhokoli zařízení HID, včetně klávesnice a myši.

Tato část se zabývá následujícími tématy:

Nezpracovaný vstupní model

Dříve klávesnice a myš obvykle generovaly vstupní data. Systém interpretoval data pocházející z těchto zařízení způsobem, který eliminoval podrobnosti o nezpracovaných informacích specifických pro zařízení. Například klávesnice vygeneruje kód kontroly specifický pro zařízení, ale systém poskytuje aplikaci s kódem virtuálního klíče. Kromě skrytí podrobností nezpracovaného vstupu správce oken nepodporuje všechny nové identifikátory HID. Aby aplikace získala vstup z nepodporovaných identifikátorů HID, musela udělat mnoho věcí: otevřít zařízení, spravovat sdílený režim, pravidelně číst zařízení nebo nastavit port pro doplňování vstupně-výstupních operací atd. Nezpracovaný vstupní model a přidružená rozhraní API byly vyvinuty tak, aby umožňovaly jednoduchý přístup k nezpracovaného vstupu ze všech vstupních zařízení, včetně klávesnice a myši.

Nezpracovaný vstupní model se liší od původního vstupního modelu Windows pro klávesnici a myš. V původním vstupním modelu aplikace přijímá vstup nezávislý na zařízení ve formě zpráv, které se odesílají nebo publikují do svých oken, například WM_CHAR, WM_MOUSEMOVEa WM_APPCOMMAND. Naproti tomu pro nezpracovaný vstup musí aplikace zaregistrovat zařízení, ze kterého chce získat data. Aplikace také získává nezpracovaný vstup prostřednictvím zprávy WM_INPUT.

Nezpracovaný vstupní model má několik výhod:

  • Aplikace nemusí zjišťovat ani otevírat vstupní zařízení.
  • Aplikace získá data přímo ze zařízení a zpracuje data podle svých potřeb.
  • Aplikace dokáže odlišit zdroj vstupu, i když je ze stejného typu zařízení. Například dvě počítačové myši.
  • Aplikace spravuje datový provoz zadáním dat z kolekce zařízení nebo pouze konkrétních typů zařízení.
  • Zařízení HID se dají používat, jakmile budou dostupná na trhu, aniž by bylo třeba čekat na nové typy zpráv nebo aktualizovaný operační systém pro přidání nových příkazů v WM_APPCOMMAND.

Upozorňujeme, že WM_APPCOMMAND poskytuje některá zařízení HID. WM_APPCOMMAND je však událost vstupu nezávislá na zařízení vyšší úrovně, zatímco WM_INPUT odesílá nezpracovaná data nízké úrovně specifická pro zařízení.

Registrace pro nezpracovaný vstup

Ve výchozím nastavení žádná aplikace nepřijímá nezpracovaný vstup. Pokud chcete přijímat nezpracovaný vstup ze zařízení, musí aplikace zařízení zaregistrovat.

Pokud chcete registrovat zařízení, aplikace nejprve vytvoří pole RAWINPUTDEVICE struktur, které určují kolekci nejvyšší úrovně (TLC) pro požadovaná zařízení. TLC je definován stránkou použití (třída zařízení) a ID použití (zařízení v rámci třídy). Pokud například chcete získat klávesovou zkratku TLC, nastavte UsagePage = 0x01 a UsageID = 0x06. Aplikace volá RegisterRawInputDevices k registraci zařízení.

Aplikace může zaregistrovat zařízení, které není aktuálně připojené k systému. Když je toto zařízení připojené, Správce Windows automaticky odešle nezpracovaný vstup do aplikace. Chcete-li získat seznam nezpracovaných vstupních zařízení v systému, aplikace volá GetRawInputDeviceList. Pomocí hDevice z tohoto volání aplikace používá funkci GetRawInputDeviceInfo ke získání informací o zařízení.

Prostřednictvím dwFlags člena RAWINPUTDEVICEmůže aplikace vybrat zařízení, která má poslouchat, a která má ignorovat. Aplikace může například požádat o vstup ze všech telefonních zařízení s výjimkou zařízení pro odpovídání. Vzorový kód najdete v tématu registrace nezpracovaných vstupních.

Všimněte si, že myš a klávesnice jsou také zařízení HID, takže data z nich mohou přicházet prostřednictvím zpráv HID WM_INPUT a také z tradičních zpráv. Aplikace může vybrat některou metodu správným výběrem příznaků v RAWINPUTDEVICE.

Stav registrace aplikace získáte tak, že kdykoli zavoláte GetRegisteredRawInputDevices.

Čtení nezpracovaných vstupů

Aplikace přijímá nezpracovaný vstup z libovolného HID, jehož kolekce nejvyšší úrovně (TLC) odpovídá TLC z registrace. Když aplikace přijme nezpracovaný vstup, fronta zpráv získá WM_INPUT zprávu a nastaví se příznak stavu fronty QS_RAWINPUT (QS_INPUT zahrnuje také tento příznak). Aplikace může přijímat data, když je v popředí a kdy je na pozadí (pokud je zaregistrovaná v RIDEV_INPUTSINK).

Nezpracovaná data můžete číst dvěma způsoby: standardní metodu a metodu uloženou do vyrovnávací paměti.

Standardní metoda čte vždy jednu strukturu RAWINPUT a je vhodná pro většinu zařízení. Aplikace volá GetMessage k načtení zprávy WM_INPUT, poté volá GetRawInputData s popisovačem HRAWINPUT, který je předán v lParam. Příklad najdete v tématu Provádění standardního čtení nezpracovaného vstupu.

Metoda s vyrovnávací pamětí načte pole struktur RAWINPUT najednou a je užitečná pro vysokofrekvenční zařízení, jako jsou myši na 1000 Hz, kde se může několik událostí hromadit mezi iteracemi smyčky zpráv. Aplikace volá GetRawInputBuffer k vyprázdnění všech kumulovaných událostí v jedné dávce. K procházení výsledného pole použijte makro NEXTRAWINPUTBLOCK .

Důležité

GetMessage před vrácením odebere aktuální WM_INPUT z nezpracované vstupní fronty. V důsledku toho GetRawInputBuffer neuvidí aktuální událost – pouze události, které přišly po ní. Při kombinování obou metod je správný vzor:

  1. Zavolejte GetRawInputData s použitím popisovače lParam za účelem čtení aktuální události.
  2. Opakovaně volat GetRawInputBuffer ve smyčce, aby se vyprázdnily všechny další události, které se hromadily ve frontě.

Příklad najdete v tématu Provádění dávkového čtení nezpracovaného vstupu.

K interpretaci nezpracovaného vstupu mohou být vyžadovány podrobné informace o identifikátorech HID. Aplikace získá informace o zařízení voláním GetRawInputDeviceInfo s popisovačem zařízení. Tento popisovač může pocházet buď z lParam při WM_INPUT přes GetRawInputData s RID_HEADER, nebo z hDevice člena RAWINPUTHEADER.

Viz také