静止画像デバイス イベントは、上位レベルのソフトウェアが通知を要求した場合に通知する必要があるデバイス レベルのイベントです。 ユーザー モード ミニドライバーは、ほとんどのデバイス イベントを定義し、イベントが発生したときに通知を配信する役割を担います。 一般に、イベントは、何らかのアクションを実行するために上位レベルのソフトウェアが必要であることを示します。
一般的な静止画像デバイス イベントは、押されたプッシュ ボタンの検出です。 たとえば、スキャナーは、テキストと写真のスキャンを開始するための個別のボタンをユーザーに提供する場合があります。 ボタンを押すと、画像を表示または保存するために上位レベルのソフトウェアが必要になります。 静止画像イベント モニターは、( IStiDevice COM インターフェイスを使用して) イベントが発生したことを検出し、( IStillImage COM インターフェイスを使用して) 以前に登録された静止画像アプリケーションを呼び出すことができます。
静止画像デバイス イベントは GUID で表されます。 sti.h では、Microsoft は次の静止画像デバイス イベントを定義します。
| イベント識別子 GUID | 目的 |
|---|---|
| GUID_DeviceArrivedLaunch | 静止画像デバイスがシステムに接続されました。 |
| GUID_ScanImage | イメージをコンピューターにスキャンする必要があります。 |
| GUID_ScanFaxImage | イメージをコンピューターにスキャンし、FAX で送信する必要があります。 |
| GUID_ScanPrintImage | イメージをコンピューターにスキャンし、印刷する必要があります。 |
| GUID_STIUserDefined1 | ユーザー定義可能なボタンが押されました。 |
| GUID_STIUserDefined2 | ユーザー定義可能なボタンが押されました。 |
| GUID_STIUserDefined3 | ユーザー定義可能なボタンが押されました。 |
ユーザー モード ミニドライバーの開発者は、可能な限り、これらの定義済みのイベント GUID を使用する必要があります。 これらの GUID が適切でない場合は、デバイス固有のイベントの GUID を定義する必要があります。
静止画像デバイス イベントを定義するには、次の手順を実行する必要があります。
各イベントの GUID を指定します。
ユーザー モード ドライバーの INF ファイルに各 GUID を含めます。
ドライバーの INF ファイル内では、各 GUID の仕様には、アスタリスク ("すべてのアプリケーション") または特定のアプリケーションの一覧のいずれかを含める必要があります。これは、イベントが発生したときにどのアプリケーションを開始するかを示します。 静止画像イベント モニターでは、この一覧を使用して、イベントに対するアプリケーションの既定の割り当てを提供します。 ユーザーは、スキャナーとカメラのコントロール パネルを使用して、これらの割り当てを変更できます。
イベント通知
ドライバーは、(非同期 I/O またはポーリングを使用して) デバイスを監視して、各 GUID に関連付けられているイベントがいつ発生するかを判断する必要があります。 デバイスの機能に応じて、ドライバーは、非同期的に、またはデバイスをポーリングする要求に応答することによって、デバイス イベントの発生をクライアントに通知できます。 (どちらの方法でも) デバイス イベントの通知を配信できるすべてのドライバーは、デバイスのSTI_DEV_CAPS構造で STI_GENCAP_NOTIFICATIONS フラグを設定する必要があります。 非同期通知ではなくポーリングをサポートするドライバーも、同じ構造でSTI_GENCAP_POLLING_NEEDED フラグを設定する必要があります。 (これらの機能は、静止画像デバイスの INF ファイルで Capabilities キーワードを使用して示す必要もあります)。
ドライバーがイベントの非同期通知をサポートしている場合、イベント モニターは IStiUSD::SetNotificationHandle を呼び出して通知を要求し、イベント ハンドルを提供します。 デバイス イベントが発生した場合、ドライバーは、イベント ハンドルを引数として使用して 、SetEvent を呼び出してイベント モニターに通知する必要があります (Microsoft Windows SDK のドキュメントを参照)。 その後、クライアントは IStiUSD::GetNotificationData を呼び出してイベントの GUID を取得できます。
ポーリングが必要な場合、イベント モニターは IStiUSD::GetStatus を呼び出してドライバーをポーリングします。次に、デバイスをポーリングし、 結果をSTI_DEVICE_STATUS 構造で返す必要があります。