Standbildgeräteereignisse

Ein Standbildgerätereignis ist ein Vorkommen auf Geräteebene, über das software der oberen Ebene benachrichtigt werden sollte, wenn diese Software eine solche Benachrichtigung angefordert hat. Der Benutzermodus-Minidriver ist für die Definition der meisten Geräteereignisse und das Senden von Benachrichtigungen beim Eintreten eines Ereignisses verantwortlich. Im Allgemeinen weisen Ereignisse darauf hin, dass Software der oberen Ebene erforderlich ist, um eine Aktion auszuführen.

Ein typisches Standbildgerätereignis ist die Erkennung eines gedrückten Drucktastens. Beispielsweise kann ein Scanner einem Benutzer separate Schaltflächen bereitstellen, um die Überprüfung von Text und Fotos zu initiieren. Wenn eine Schaltfläche gedrückt wird, wird Software der oberen Ebene benötigt, um das Bild anzuzeigen oder zu speichern. Der Standbildereignismonitor erkennt, dass das Ereignis aufgetreten ist (mithilfe der IStiDevice COM-Schnittstelle) und kann eine Standbildanwendung aufrufen, die zuvor registriert wurde (mithilfe der IStillImage COM-Schnittstelle).

Standbildgeräteereignisse werden durch GUIDs dargestellt. In sti.h definiert Microsoft die folgenden Standbildgeräteereignisse:

Ereignis-GUID Zweck
GUID_DeviceArrivedLaunch Ein Standbildgerät wurde gerade an das System angefügt.
GUID_ScanImage Ein Bild sollte auf dem Computer gescannt werden.
GUID_ScanFaxImage Ein Bild sollte in den Computer eingescannt und dann gefaxt werden.
GUID_ScanPrintImage Ein Bild sollte auf dem Computer gescannt und dann gedruckt werden.
GUID_STIUserDefined1 Eine vom Benutzer definierbare Schaltfläche wurde gedrückt.
GUID_STIUserDefined2 Eine vom Benutzer definierbare Schaltfläche wurde gedrückt.
GUID_STIUserDefined3 Eine vom Benutzer definierbare Schaltfläche wurde gedrückt.

Entwickler von Benutzermodus-Minidrivern sollten diese vordefinierten Ereignis-GUIDs wann immer möglich verwenden. Wenn diese GUIDs nicht geeignet sind, müssen GUIDs für gerätespezifische Ereignisse definiert werden.

Um ein Standbildgeräteereignis zu definieren, müssen Sie:

  • Geben Sie eine GUID für jedes Ereignis an.

  • Schließen Sie jede GUID in die INF-Datei des Benutzermodustreibers ein.

In der INF-Datei des Treibers muss jede GUID-Spezifikation entweder ein Sternchen (bedeutet "alle Anwendungen") oder eine Liste bestimmter Anwendungen enthalten, die angeben, welche Anwendungen gestartet werden sollen, wenn das Ereignis auftritt. Der Ereignismonitor für Standbilder verwendet diese Liste, um Standardzuweisungen von Anwendungen zu Ereignissen bereitzustellen. Der Benutzer kann diese Zuweisungen mit dem Systemsteuerung Scanner und Kameras ändern.

Ereignisbenachrichtigung

Der Treiber muss das Gerät überwachen (entweder mithilfe von asynchronen E/A- oder Abrufvorgängen), um zu bestimmen, wann das Ereignis auftritt, das jeder GUID zugeordnet ist. Abhängig von den Gerätefunktionen kann der Treiber Clients entweder asynchron oder durch Antworten auf eine Anforderung zum Abfragen des Geräts über das Auftreten von Geräteereignissen benachrichtigen. Alle Treiber, die Benachrichtigungen über Geräteereignisse (mit beiden Methoden) übermitteln können, müssen das STI_GENCAP_NOTIFICATIONS-Flag in der STI_DEV_CAPS Struktur des Geräts festlegen. Treiber, die Abfragen und nicht asynchrone Benachrichtigungen unterstützen, müssen auch das STI_GENCAP_POLLING_NEEDED-Flag in derselben Struktur festlegen. (Diese Funktionen müssen auch mithilfe der Schlüsselwort (keyword) Funktionen in INF-Dateien für Standbildgeräte angegeben werden.)

Wenn ein Treiber asynchrone Benachrichtigungen über Ereignisse unterstützt, ruft der Ereignismonitor IStiUSD::SetNotificationHandle auf, um Benachrichtigungen anzufordern und ein Ereignishandle anzugeben. Wenn ein Geräteereignis auftritt, muss der Treiber den Ereignismonitor benachrichtigen, indem er SetEvent aufruft (siehe Microsoft Windows SDK Dokumentation), wobei das Ereignishandle als Argument verwendet wird. Der Client kann dann IStiUSD::GetNotificationData aufrufen, um die GUID des Ereignisses abzurufen.

Wenn eine Abfrage erforderlich ist, ruft der Ereignismonitor IStiUSD::GetStatus auf, um den Treiber abzufragen, der wiederum das Gerät abfragen und Ergebnisse in einer STI_DEVICE_STATUS Struktur zurückgeben muss.