Window检测设备插拔的方法 C语言
时间: 2024-04-13 15:28:43 浏览: 99
在 C 语言中,可以使用 Windows API 来检测设备的插拔。下面是一个简单的示例代码:
```c
#include <stdio.h>
#include <Windows.h>
int main() {
DEV_BROADCAST_DEVICEINTERFACE filter;
ZeroMemory(&filter, sizeof(filter));
filter.dbcc_size = sizeof(filter);
filter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
HDEVNOTIFY hNotify = RegisterDeviceNotification(
NULL,
&filter,
DEVICE_NOTIFY_WINDOW_HANDLE
);
if (hNotify == NULL) {
printf("注册设备变化通知失败!\n");
return 1;
}
HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (hEvent == NULL) {
printf("创建事件对象失败!\n");
UnregisterDeviceNotification(hNotify);
return 1;
}
HANDLE hDevNotifyThread = CreateThread(NULL, 0, DeviceNotifyThread, hEvent, 0, NULL);
if (hDevNotifyThread == NULL) {
printf("创建设备变化线程失败!\n");
CloseHandle(hEvent);
UnregisterDeviceNotification(hNotify);
return 1;
}
printf("正在等待设备插拔...\n");
WaitForSingleObject(hEvent, INFINITE);
CloseHandle(hDevNotifyThread);
CloseHandle(hEvent);
UnregisterDeviceNotification(hNotify);
return 0;
}
DWORD WINAPI DeviceNotifyThread(LPVOID lpParam) {
HANDLE hEvent = (HANDLE)lpParam;
MSG msg;
while (GetMessage(&msg, NULL, 0, 0)) {
if (msg.message == WM_DEVICECHANGE) {
switch (msg.wParam) {
case DBT_DEVICEARRIVAL:
printf("设备插入\n");
break;
case DBT_DEVICEREMOVECOMPLETE:
printf("设备移除\n");
break;
}
}
}
SetEvent(hEvent);
return 0;
}
```
以上代码中,我们创建了一个窗口消息通知的线程,并通过 `WM_DEVICECHANGE` 窗口消息来接收设备变化事件。当有设备插入或移除时,会分别触发 `DBT_DEVICEARRIVAL` 和 `DBT_DEVICEREMOVECOMPLETE` 参数对应的分支。我们使用了一个事件对象来控制主线程的等待,当设备变化线程接收到退出消息时,会触发事件从而解除主线程的等待。
请注意,这段代码需要在一个具有消息循环的窗口程序中运行才能正常工作。如果只是想要简单地检测设备插拔,可以将上述代码放入一个独立的线程中执行,并使用一个标志位来控制线程的运行和退出。
阅读全文