Delen via


Overzicht van onbewerkte invoer

Er zijn veel gebruikersinvoerapparaten naast het traditionele toetsenbord en de muis. Gebruikersinvoer kan bijvoorbeeld afkomstig zijn van een joystick, een touchscreen, een microfoon of andere apparaten die een grote flexibiliteit in gebruikersinvoer bieden. Deze apparaten staan gezamenlijk bekend als Human Interface Devices (HID's). De onbewerkte invoer-API biedt een stabiele en robuuste manier voor toepassingen om onbewerkte invoer van elke HID te accepteren, inclusief het toetsenbord en de muis.

In deze sectie worden de volgende onderwerpen behandeld:

Onbewerkt invoermodel

Voorheen hebben het toetsenbord en de muis doorgaans invoergegevens gegenereerd. Het systeem interpreteerde de gegevens die afkomstig zijn van deze apparaten op een manier die de apparaatspecifieke details van de onbewerkte informatie elimineerde. Het toetsenbord genereert bijvoorbeeld de apparaatspecifieke scancode, maar het systeem biedt een toepassing met de code van de virtuele sleutel. Naast het verbergen van de details van de onbewerkte invoer, ondersteunt de venstermanager niet alle nieuwe HID's. Om invoer te krijgen van de niet-ondersteunde HID's, moest een toepassing veel dingen doen: het apparaat openen, de gedeelde modus beheren, het apparaat periodiek lezen of de I/O-voltooiingspoort instellen, enzovoort. Het onbewerkte invoermodel en de bijbehorende API's zijn ontwikkeld om eenvoudige toegang tot onbewerkte invoer van alle invoerapparaten mogelijk te maken, inclusief het toetsenbord en de muis.

Het onbewerkte invoermodel verschilt van het oorspronkelijke Windows-invoermodel voor het toetsenbord en de muis. In het oorspronkelijke invoermodel ontvangt een toepassing apparaatonafhankelijke invoer in de vorm van berichten die naar de vensters worden verzonden of gepost, zoals WM_CHAR, WM_MOUSEMOVEen WM_APPCOMMAND. Voor onbewerkte invoer moet een toepassing daarentegen de apparaten registreren waaruit gegevens moeten worden opgehaald. Bovendien haalt de toepassing de onbewerkte invoer op via het WM_INPUT bericht.

Er zijn verschillende voordelen voor het onbewerkte invoermodel:

  • Een toepassing hoeft het invoerapparaat niet te detecteren of te openen.
  • Een toepassing haalt de gegevens rechtstreeks van het apparaat op en verwerkt de gegevens voor de behoeften ervan.
  • Een toepassing kan de bron van de invoer onderscheiden, zelfs als deze afkomstig is van hetzelfde type apparaat. Bijvoorbeeld twee muisapparaten.
  • Een toepassing beheert het gegevensverkeer door gegevens op te geven uit een verzameling apparaten of alleen specifieke apparaattypen.
  • HID-apparaten kunnen worden gebruikt wanneer ze beschikbaar zijn in de marketplace, zonder te wachten op nieuwe berichttypen of een bijgewerkt besturingssysteem met nieuwe opdrachten in WM_APPCOMMAND.

Houd er rekening mee dat WM_APPCOMMAND ondersteuning biedt voor sommige HID-apparaten. WM_APPCOMMAND is echter een apparaatonafhankelijke invoergebeurtenis op een hoger niveau, terwijl WM_INPUT onbewerkte gegevens op laag niveau verzendt die specifiek zijn voor een apparaat.

Registratie voor onbewerkte invoer

Standaard ontvangt geen toepassing onbewerkte invoer. Als u onbewerkte invoer van een apparaat wilt ontvangen, moet een toepassing het apparaat registreren.

Om apparaten te registreren, maakt een toepassing eerst een reeks van RAWINPUTDEVICE- structuren die de verzameling op het hoogste niveau (TLC) voor de gewenste apparaten opgeven. De TLC wordt gedefinieerd door een gebruikspagina (de klasse van het apparaat) en een gebruiks-id (het apparaat binnen de klasse). Als u bijvoorbeeld het toetsenbord-TLC wilt ophalen, stelt u UsagePage = 0x01 en UsageID = 0x06 in. De toepassing roept RegisterRawInputDevices aan om de apparaten te registreren.

Houd er rekening mee dat een toepassing een apparaat kan registreren dat momenteel niet aan het systeem is gekoppeld. Wanneer dit apparaat is gekoppeld, verzendt Windows Manager automatisch de onbewerkte invoer naar de toepassing. Een toepassing roept GetRawInputDeviceListom de lijst met onbewerkte invoerapparaten op het systeem op te halen. Met behulp van de hDevice- van deze aanroep roept een toepassing GetRawInputDeviceInfo om de apparaatgegevens op te halen.

Via de dwFlags-member van RAWINPUTDEVICE-kan een toepassing de apparaten selecteren waarnaar geluisterd moet worden en ook de apparaten die genegeerd moeten worden. Een toepassing kan bijvoorbeeld vragen om invoer van alle telefonieapparaten, behalve van antwoordapparaten. Zie Registreren voor onbewerkte invoervoor voorbeeldcode.

Houd er rekening mee dat de muis en het toetsenbord ook HID's zijn, waardoor gegevens van hen zowel via het HID-bericht WM_INPUT als via traditionele berichten kunnen komen. Een toepassing kan een van beide methoden selecteren door de juiste selectie van vlaggen in RAWINPUTDEVICE-.

Als u de registratiestatus van een toepassing wilt ophalen, roept u op elk gewenst moment GetRegisteredRawInputDevices aan.

Onbewerkte invoer lezen

Een toepassing ontvangt onbewerkte invoer van hid waarvan verzameling op het hoogste niveau (TLC) overeenkomt met een TLC uit de registratie. Wanneer een toepassing onbewerkte invoer ontvangt, krijgt de berichtenwachtrij een WM_INPUT bericht en wordt de wachtrijstatusvlag QS_RAWINPUT ingesteld (QS_INPUT bevat deze vlag ook). Een toepassing kan gegevens ontvangen wanneer deze zich op de voorgrond bevindt en wanneer deze zich op de achtergrond bevindt (indien geregistreerd bij RIDEV_INPUTSINK).

Er zijn twee manieren om de onbewerkte gegevens te lezen: de standaardmethode en de gebufferde methode.

De standaardmethode leest één RAWINPUT-structuur tegelijk en is voldoende voor de meeste apparaten. De toepassing roept GetMessage aan om het WM_INPUT bericht op te halen en roept vervolgens GetRawInputData aan met de HRAWINPUT-ingang die is doorgegeven in lParam. Zie Voor een voorbeeld het uitvoeren van een standaardleesbewerking van onbewerkte invoer.

De methode met buffer leest een matrix van RAWINPUT-structuren tegelijk en is nuttig voor apparaten met een hoge frequentie, zoals muizen op 1000Hz, waarbij meerdere gebeurtenissen zich kunnen verzamelen tussen iteraties van de berichtlus. De toepassing roept GetRawInputBuffer aan om alle samengevoegde gebeurtenissen in één batch leeg te maken. Gebruik de macro NEXTRAWINPUTBLOCK om de resulterende matrix te doorlopen.

Belangrijk

GetMessage verwijdert de huidige WM_INPUT uit de ruwe invoerwachtrij voordat het terugkeert. Als gevolg hiervan ziet GetRawInputBuffer de huidige gebeurtenis niet, alleen gebeurtenissen die erna zijn aangekomen. Bij het combineren van beide methoden is het juiste patroon:

  1. Roep GetRawInputData aan met de lParam-ingang om de huidige gebeurtenis te lezen.
  2. Roep GetRawInputBuffer in een lus aan om eventuele extra gebeurtenissen die in de wachtrij zijn verzameld, leeg te maken.

Zie Voor een voorbeeld het uitvoeren van een batchgewijze leesbewerking van onbewerkte invoer.

Voor het interpreteren van de onbewerkte invoer is mogelijk gedetailleerde informatie over de HID's vereist. Een toepassing haalt de apparaatgegevens op door GetRawInputDeviceInfo aan te roepen met de apparaatgreep. Deze handle kan afkomstig zijn van de lParam van WM_INPUT via GetRawInputData met RID_HEADER, of van het hDevice-lid van RAWINPUTHEADER.

Zie ook