注册窗口将接收通知的设备或设备类型。
注意
如果代码面向 Windows 8 或更高版本,则可以使用 CM_Register_Notification 而不是 RegisterDeviceNotification。 CM_Register_Notification 的优点是它不需要窗口句柄才能工作。
语法
HDEVNOTIFY RegisterDeviceNotificationW(
[in] HANDLE hRecipient,
[in] LPVOID NotificationFilter,
[in] DWORD Flags
);
参数
[in] hRecipient
窗口或服务的句柄,它将接收 NotificationFilter 参数中指定的设备的设备事件。 同一窗口句柄可用于多个调用来 RegisterDeviceNotification。
服务可以指定窗口句柄或服务状态句柄。
[in] NotificationFilter
指向一个数据块的指针,指定应为其发送通知的设备的类型。 此块始终以 DEV_BROADCAST_HDR 结构开头。 此标头后面的数据取决于 dbch_devicetype 成员的值,可以 DBT_DEVTYP_DEVICEINTERFACE 或 DBT_DEVTYP_HANDLE。 有关详细信息,请参阅“备注”。
[in] Flags
此参数可以是下列值之一。
| 价值 | 意义 |
|---|---|
|
hRecipient 参数是窗口句柄。 |
|
hRecipient 参数是服务状态句柄。 |
此外,还可以指定以下值。
| 价值 | 意义 |
|---|---|
|
通知所有设备接口类的设备接口事件的接收者。 (将忽略 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_devicetypeDBT_DEVTYP_VOLUME,函数将失败。 系统不会直接使用 OEM 定义的设备,因此,如果 dbch_devicetypeDBT_DEVTYP_OEM,函数将失败。
例子
有关示例,请参阅 注册设备通知。
注意
winuser.h 标头将 RegisterDeviceNotification 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的
要求
| 要求 | 价值 |
|---|---|
| 最低支持的客户端 | Windows XP |
| 支持的最低服务器 | Windows Server 2003 |
| 目标平台 | 窗户 |
| 标头 | winuser.h (包括 Windows.h) |
| 库 | User32.lib |
| DLL | User32.dll |
| API 集 | ext-ms-win-ntuser-misc-l1-1-0(在 Windows 8 中引入) |