检测Windows上的外部设备插入
Detect external devices insertion on Windows
我有点困惑于如何用用户插入设备(USB、HID等)的事件通知我的c++应用程序。应用程序类型没有定义。我试着玩控制台/仅消息/服务示例应用程序,但没有结果。我使用的是VS2015和Windows 10。
我发现有多种方法来处理它:
- 像这里一样使用WMI。但我真的不明白WMI在哪里
-
使用RegisterDeviceNotification和WM_DEVICECHANGE。据我所知,控制台应用程序没有办法做到这一点,只有一次使用GUI(真实窗口)或仅消息窗口。我已经用这个答案中的例子尝试了最后一个,但当我插入U盘时,我的应用程序不会收到任何通知。我找到了这个答案(来自与上面提到的答案相同的问题),并尝试使用ChangeWindowMessageFilterEx()函数和来自user32.dll的GetProcAddress来加载它,而不需要将dll连接到我的应用程序,方法如下:
BOOL InitInstance(HWND hWnd) { HMODULE hDll = GetModuleHandle(TEXT("user32.dll")); if (hDll) { typedef BOOL(WINAPI *MESSAGEFILTERFUNCEX)(HWND hWnd, UINT message, DWORD action, VOID* pChangeFilterStruct); const DWORD MSGFLT_ALLOW = 1; MESSAGEFILTERFUNCEX ChangeWindowMessageFilterEx= (MESSAGEFILTERFUNCEX)::GetProcAddress(hDll, "ChangeWindowMessageFilterEx"); if (ChangeWindowMessageFilterEx) return func(hWnd, WM_COPYDATA, MSGFLT_ALLOW, NULL); } return FALSE; }
这个功能的用途是:
hWnd = CreateWindowEx(0, CLS_NAME, "DevNotifWnd", WS_ICONIC, 0, 0, CW_USEDEFAULT, 0, HWND_MESSAGE, NULL, GetModuleHandle(0), (void*)&guid); InitInstance(hWnd);
但没有效果。
-
使用
while(true){...}
循环并调用适当的Win API函数,如本答案所示。但这种方式似乎不是解决我问题的完美方法。
我的问题是:
- 有人能告诉我什么是最好的方法吗?如果它是第二个带有RegisterDeviceNotification的应用程序,为什么它在仅消息窗口应用程序的情况下不起作用
- 是否存在其他方式?若并没有,我能做些什么,例如,当安装了某些软件时通知应用程序
欢迎发表任何意见。
所以我终于找到了问题的答案。
-
问题出在我为
NotificationFilter
提供的GUID上。因此,我使用以下代码将其设置为接收来自所有设备的通知:DEV_BROADCAST_DEVICEINTERFACE通知过滤器;ZeroMemory(&NotificationFilter,sizeof(NotificationFilter));
NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; // No need to set up dbcc_classguid as it is ignored when // DEVICE_NOTIFY_ALL_INTERFACE_CLASSES is setted (see line down below) HDEVNOTIFY dev_notify = RegisterDeviceNotification(hwnd, &NotificationFilter, DEVICE_NOTIFY_ALL_INTERFACE_CLASSES);
-
至于应用程序可以注册的窗口中的其他类型的通知,我只找到了一个部分不推荐使用的所有Win32 API函数列表,在那里我找到了一些使用Ctrl+F搜索的新通知:)
希望这能节省一些时间。
- 正在查找文档以获得PS4平台的C++中的设备信息
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 预处理器:插入结构名称中的前一个行号
- 在未初始化映射的情况下,将值插入到映射的映射中
- 如何在c++中只将键插入到bimap的一侧
- STM32使用HAL库的外部闪存读取设备ID
- 如何测试 USB HID 句柄由于设备被重新插入而无效
- C++从外部设备读取数据 - 连接:光电USB
- 在 CUDA 设备代码和主机代码中创建模板类对象时未解析的外部函数
- 当插入第二个监视器时,全屏Direct3D9设备仅以本机分辨率显示
- 插入标头后出现无法解决的外部符号错误(LNK2019)
- 将元素从类外部插入到私有映射中
- c++ DirectX创建设备未解析的外部符号
- 使用哪个代码片段来处理USB设备插入
- 在内核外部使用CUDA printf来打印设备变量
- 检测Windows上的外部设备插入
- 如何显示QWidget以上数据流从外部库处理的设备
- 以前在 CUDA C++ 中定义的外部全局设备变量
- 确定所插入的设备及其类型