RegisterDeviceNotificationA 関数 (winuser.h)

ウィンドウが通知を受信するデバイスまたはデバイスの種類を登録します。

注意

コードがWindows 8以降のバージョンの Windows を対象とする場合は、RegisterDeviceNotification の代わりにCM_Register_Notificationを使用できます。 CM_Register_Notificationの利点は、ウィンドウ ハンドルが機能する必要がないということです。

構文

HDEVNOTIFY RegisterDeviceNotificationA(
  [in] HANDLE hRecipient,
  [in] LPVOID NotificationFilter,
  [in] DWORD  Flags
);

パラメーター

[in] hRecipient

NotificationFilter パラメーターで指定されたデバイスのデバイス イベントを受信するウィンドウまたはサービスへのハンドル。 RegisterDeviceNotification の複数の呼び出しでは、同じウィンドウ ハンドルを使用できます。

サービスでは、ウィンドウ ハンドルまたはサービス状態ハンドルを指定できます。

[in] NotificationFilter

通知を送信するデバイスの種類を指定するデータ ブロックへのポインター。 このブロックは常に 、DEV_BROADCAST_HDR 構造体で始まります。 このヘッダーの後のデータは、DBT_DEVTYP_DEVICEINTERFACEまたはDBT_DEVTYP_HANDLEできるdbch_devicetype メンバー値に依存します。 詳細については、「解説」を参照してください。

[in] Flags

このパラメーターには、次の値のいずれかを指定できます。

意味
DEVICE_NOTIFY_WINDOW_HANDLE
0x00000000
hRecipient パラメーターはウィンドウ ハンドルです。
DEVICE_NOTIFY_SERVICE_HANDLE
0x00000001
hRecipient パラメーターは、サービス状態ハンドルです。
 

さらに、次の値を指定できます。

意味
DEVICE_NOTIFY_ALL_INTERFACE_CLASSES
0x00000004
すべてのデバイス インターフェイス クラスのデバイス インターフェイス イベントを受信者に通知します。 ( dbcc_classguid メンバーは無視されます。

この値は、 dbch_devicetype メンバーが DBT_DEVTYP_DEVICEINTERFACEされている場合にのみ使用できます。

戻り値

関数が成功した場合、戻り値はデバイス通知ハンドルです。

関数が失敗した場合は、返される値は NULL です。 詳細なエラー情報を得るには、GetLastError を呼び出します。

解説

アプリケーションは BroadcastSystemMessage 関数を使用してイベント通知を送信します。 最上位のウィンドウを持つアプリケーションは、 WM_DEVICECHANGE メッセージを処理することで基本的な通知を受け取ることができます。 アプリケーションは RegisterDeviceNotification 関数を使用して、デバイス通知を受信するために登録できます。

サービスは RegisterDeviceNotification 関数を使用して、デバイス通知を受信するために登録できます。 サービスが hRecipient パラメーターでウィンドウ ハンドルを指定した場合、通知はウィンドウ プロシージャに送信されます。 hRecipient がサービス状態ハンドルの場合、SERVICE_CONTROL_DEVICEEVENT通知がサービス 制御ハンドラーに送信されます。 サービス コントロール ハンドラーの詳細については、「 HandlerEx」を参照してください。

プラグ アンド プレイデバイス イベントは、できるだけ早く処理してください。 そうしないと、システムが応答しなくなる可能性があります。 イベント ハンドラーが実行をブロックする可能性がある操作 (I/O など) を実行する場合は、別のスレッドを起動して操作を非同期的に実行することをお勧めします。

RegisterDeviceNotification によって返されるデバイス通知ハンドルは、必要なくなったときに UnregisterDeviceNotification 関数を呼び出して閉じる必要があります。

DBT_DEVICEARRIVALイベントとDBT_DEVICEREMOVECOMPLETE イベントは、ポート デバイスのすべての最上位ウィンドウに自動的にブロードキャストされます。 そのため、ポートに対して RegisterDeviceNotification を呼び出す必要はありません。 dbch_devicetype メンバーが DBT_DEVTYP_PORT場合、関数は失敗します。 ボリューム通知も最上位のウィンドウにブロードキャストされるため、dbch_devicetypeがDBT_DEVTYP_VOLUME場合、関数は失敗します。 OEM で定義されたデバイスはシステムによって直接使用されないため、dbch_devicetypeがDBT_DEVTYP_OEMされた場合、関数は失敗します。

例については、「 デバイス通知の登録」を参照してください。

注意

winuser.h ヘッダーは RegisterDeviceNotification をエイリアスとして定義します。これは、UNICODE プリプロセッサ定数の定義に基づいて、この関数の ANSI または Unicode バージョンを自動的に選択します。 encoding-neutral エイリアスの使用を encoding-neutral ではないコードと混在すると、コンパイル エラーまたはランタイム エラーが発生する不一致が発生する可能性があります。 詳細については、「 関数プロトタイプの規則」を参照してください。

要件

要件
サポートされている最小のクライアント Windows XP
サポートされている最小のサーバー Windows Server 2003
対象プラットフォーム Windows
ヘッダー winuser.h (Windows.h を含む)
Library User32.lib
[DLL] User32.dll
API セット ext-ms-win-ntuser-misc-l1-1-0 (Windows 8で導入)

こちらもご覧ください

BroadcastSystemMessage

DEV_BROADCAST_HDR

デバイス管理関数

デバイス通知

HandlerEx

RegisterDeviceNotification

UnregisterDeviceNotification

WM_DEVICECHANGE