Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Neben der herkömmlichen Tastatur und Maus gibt es viele Benutzereingabegeräte. Benutzereingaben können beispielsweise von einem Joystick, einem Touchscreen, einem Mikrofon oder anderen Geräten stammen, die eine hohe Flexibilität bei der Benutzereingabe ermöglichen. Diese Geräte werden gemeinsam als Human Interface Devices (HIDs) bezeichnet. Die rohe Eingabe-API bietet eine stabile und robuste Möglichkeit für Anwendungen, rohe Eingaben von hiD, einschließlich Tastatur und Maus, zu akzeptieren.
In diesem Abschnitt werden die folgenden Themen behandelt:
Roheingabemodell
Zuvor generierte die Tastatur und Maus in der Regel Eingabedaten. Das System interpretierte die Daten, die von diesen Geräten stammen, so, dass die gerätespezifischen Details der Rohinformationen eliminiert wurden. Beispielsweise generiert die Tastatur den gerätespezifischen Scancode, aber das System stellt eine Anwendung mit dem virtuellen Tastencode bereit. Neben dem Ausblenden der Details der unformatierten Eingabe unterstützt der Fenster-Manager nicht alle neuen HIDs. Um Eingaben von den nicht unterstützten HIDs zu erhalten, musste eine Anwendung viele Aktionen ausführen: Öffnen Des Geräts, Verwalten des gemeinsam genutzten Modus, regelmäßiges Lesen des Geräts oder Einrichten des E/A-Abschlussports usw. Das Roheingabemodell und die zugehörigen APIs wurden entwickelt, um einfachen Zugriff auf unformatierte Eingaben von allen Eingabegeräten, einschließlich Tastatur und Maus, zu ermöglichen.
Das rohe Eingabemodell unterscheidet sich vom ursprünglichen Windows-Eingabemodell für die Tastatur und Maus. Im ursprünglichen Eingabemodell empfängt eine Anwendung geräteunabhängige Eingaben in Form von Nachrichten, die an die Fenster gesendet oder gepostet werden, z. B. WM_CHAR, WM_MOUSEMOVE und WM_APPCOMMAND. Im Gegensatz dazu muss eine Anwendung für die Roheingabe die Geräte registrieren, von der daten abgerufen werden sollen. Außerdem ruft die Anwendung die unformatierte Eingabe über die WM_INPUT Nachricht ab.
Für das rohe Eingabemodell gibt es mehrere Vorteile:
- Eine Anwendung muss das Eingabegerät nicht erkennen oder öffnen.
- Eine Anwendung ruft die Daten direkt vom Gerät ab und verarbeitet die Daten für ihre Anforderungen.
- Eine Anwendung kann die Quelle der Eingabe unterscheiden, auch wenn sie vom gleichen Gerätetyp stammt. Beispielsweise zwei Mausgeräte.
- Eine Anwendung verwaltet den Datenverkehr, indem Daten aus einer Sammlung von Geräten oder nur bestimmten Gerätetypen angegeben werden.
- HID-Geräte können verwendet werden, wenn sie auf dem Marketplace verfügbar sind, ohne auf neue Nachrichtentypen oder ein aktualisiertes Betriebssystem zu warten, um neue Befehle in WM_APPCOMMAND zu haben.
Beachten Sie, dass WM_APPCOMMAND einige HID-Geräte bereitstellt. WM_APPCOMMAND ist jedoch ein geräteunabhängiges Eingabeereignis auf höherer Ebene, während WM_INPUT unformatierte Daten mit niedriger Ebene sendet, die für ein Gerät spezifisch sind.
Registrierung für Unformatierte Eingaben
Standardmäßig empfängt keine Anwendung unformatierte Eingaben. Um unformatierte Eingaben von einem Gerät zu empfangen, muss eine Anwendung das Gerät registrieren.
Zum Registrieren von Geräten erstellt eine Anwendung zunächst ein Array von RAWINPUTDEVICE-Strukturen , die die Sammlung der obersten Ebene (TLC) für die gewünschten Geräte angeben. Der TLC wird durch eine Verwendungsseite (die Klasse des Geräts) und eine Verwendungs-ID (das Gerät innerhalb der Klasse) definiert. Um z. B. den Tastatur-TLC abzurufen, legen Sie UsagePage = 0x01 und UsageID = 0x06 fest. Die Anwendung ruft RegisterRawInputDevices auf, um die Geräte zu registrieren.
Beachten Sie, dass eine Anwendung ein Gerät registrieren kann, das derzeit nicht an das System angeschlossen ist. Wenn dieses Gerät angefügt ist, sendet der Windows-Manager automatisch die unformatierte Eingabe an die Anwendung. Um die Liste der rohen Eingabegeräte auf dem System abzurufen, ruft eine Anwendung GetRawInputDeviceList auf. Mithilfe des hDevice-Aufrufs ruft eine Anwendung GetRawInputDeviceInfo auf, um die Geräteinformationen abzurufen.
Über das dwFlags-Mitglied von RAWINPUTDEVICE kann eine Anwendung die Geräte auswählen, die überwacht werden sollen, und auch diejenigen, die sie ignorieren möchten. Eine Anwendung kann z. B. eingaben von allen Telefoniegeräten mit Ausnahme von Antwortmaschinen anfordern. Beispielcode finden Sie unter Registrieren für unformatierte Eingaben.
Beachten Sie, dass die Maus und die Tastatur auch HIDs sind, sodass Daten daraus sowohl die HID-Nachricht WM_INPUT als auch aus herkömmlichen Nachrichten durchlaufen können. Eine Anwendung kann eine der beiden Methoden durch die richtige Auswahl von Flags in RAWINPUTDEVICE auswählen.
Rufen Sie GetRegisteredRawInputDevices jederzeit auf, um den Registrierungsstatus einer Anwendung abzurufen.
Unformatierte Eingabe lesen
Eine Anwendung empfängt rohe Eingaben von jedem HID, dessen oberste Sammlungsebene (TLC) einer TLC aus der Registrierung entspricht. Wenn eine Anwendung unformatierte Eingaben empfängt, erhält ihre Nachrichtenwarteschlange eine WM_INPUT-Nachricht, und die Kennzeichnung des Warteschlangenstatus QS_RAWINPUT wird gesetzt (QS_INPUT enthält dieses Flag ebenfalls). Eine Anwendung kann Daten empfangen, wenn sie sich im Vordergrund und im Hintergrund befindet (wenn sie mit RIDEV_INPUTSINK registriert ist).
Es gibt zwei Möglichkeiten zum Lesen der Rohdaten: die Standardmethode und die gepufferte Methode.
Die Standardmethode liest jeweils eine RAWINPUT-Struktur und ist für die meisten Geräte ausreichend. Die Anwendung ruft GetMessage auf, um die WM_INPUT Nachricht abzurufen, und ruft dann GetRawInputData mit dem in lParam übergebenen HRAWINPUT-Handle auf. Ein Beispiel finden Sie unter Ausführen eines Standardlesevorgangs für unformatierte Eingaben.
Die gepufferte Methode liest ein Array von RAWINPUT-Strukturen auf einmal und ist für Hochfrequenzgeräte wie Mäuse mit 1000Hz nützlich, bei denen sich zwischen den Iterationen der Nachrichtenschleife mehrere Ereignisse ansammeln können. Die Anwendung ruft GetRawInputBuffer auf, um alle gesammelten Ereignisse in einem einzigen Batch zu entwässern. Verwenden Sie das NEXTRAWINPUTBLOCK-Makro , um das resultierende Array zu durchlaufen.
Von Bedeutung
GetMessage entfernt das aktuelle WM_INPUT aus der rohen Eingabewarteschlange, bevor es zurückgegeben wird. Daher wird getRawInputBuffer das aktuelle Ereignis nicht sehen – nur Ereignisse, die danach eingegangen sind. Bei der Kombination beider Methoden lautet das richtige Muster:
- Rufen Sie GetRawInputData mit dem lParam-Handle auf, um das aktuelle Ereignis zu lesen.
- Rufen Sie GetRawInputBuffer in einer Schleife auf, um alle zusätzlichen Ereignisse zu verarbeiten, die sich in der Warteschlange angesammelt haben.
Ein Beispiel finden Sie unter Ausführen eines Batchlesevorgangs für unformatierte Eingaben.
Um die Roheingabe zu interpretieren, sind möglicherweise detaillierte Informationen zu den HIDs erforderlich. Eine Anwendung ruft die Geräteinformationen durch Aufrufen von GetRawInputDeviceInfo mit dem Gerätehandle ab. Dieser Griff kann entweder aus dem lParam von WM_INPUT über GetRawInputData mit RID_HEADER oder aus dem hDevice-Element von RAWINPUTHEADER stammen.