我正在为需要处理USB插入/删除事件的现有应用程序编写扩展.我知道感兴趣的设备的VID/PID.但是,我没有访问窗口句柄,所以我不知道是否RegisterDeviceNotification会有很多用处,除非有办法通过获取句柄WINAPI.使用C++检测USB插入/移除事件的最佳方法是什么?
Microsoft网站上的此示例代码显示了如何通过WMI接收事件通知:
如何修改以接收USB插入/移除事件?或者,我还有另一种方法吗?我正在使用Visual Studio 2008.谢谢.
附加信息
这是我到目前为止(减去错误处理):
DEFINE_GUID(GUID_INTERFACE_CP210x, 0x993f7832, 0x6e2d, 0x4a0f, 0xb2, 0x72, 0xe2, 0xc7, 0x8e, 0x74, 0xf9, 0x3e);
MyClass::MyClass()
{
// Generate message-only window
_pWndClassEx = (WNDCLASSEX *)malloc( sizeof(WNDCLASSEX) );
memset( _pWndClassEx, 0, sizeof(WNDCLASSEX) );
_pWndClassEx->cbSize = sizeof(WNDCLASSEX);
_pWndClassEx->lpfnWndProc = (WNDPROC)WndProc; // function which will handle messages
_pWndClassEx->hInstance = GetCurrentModule();
_pWndClassEx->lpszClassName = pClassName;
atom = RegisterClassEx( _pWndClassEx );
_hWnd = CreateWindowEx( 0, pClassName, pWindowName, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL ); …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用SetupDi函数枚举所有连接的USB设备的设备路径.设备路径是CreateFile()中使用的路径,因此我可以与设备通信.
但是,SetupDiGetDeviceInterface需要一个接口GUID,但我不是专门寻找一个特定的接口(除了所有连接的USB).这部分被评为/*???*/在下面的来源中.
尝试的解决方案:
我试图提供GUID_DEVCLASS_UNKNOWN = {0x4d36e97e,0xe325,0x11ce,{0xbf,0xc1,0x08,0x00,0x2b,0xe1,0x03,0x18}}; 但这引起了"没有更多接口"的错误.
我也尝试将deviceInfoData.ClassGuid提供给SetupDiGetDeviceInterface但是我得到了与上面相同的错误,"没有更多的接口".
问题:
是否有涵盖所有USB设备的通用接口类?(HID,通用等)
或者是否有一个替代功能,它将为我提供设备的路径?(SetupDiGetDeviceInterfaceDetail返回的SP_DEVICE_INTERFACE_DETAIL_DATA结构的Instread).
资源:
HDEVINFO deviceInfoList
SP_DEVINFO_DATA deviceInfoData;
deviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
SP_DEVICE_INTERFACE_DATA deviceInterfaceData;
PSP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData = NULL;
DWORD requiredLength = 0;
char *hardwareID = 0;
// Retrieve a list of all present devices
deviceInfoList = SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE | DIGCF_ALLCLASSES);
if (deviceInfoList == INVALID_HANDLE_VALUE) {
SetupDiDestroyDeviceInfoList(deviceInfoList);
return false;
}
// Iterate over the list
for (DWORD i = 0; SetupDiEnumDeviceInfo(deviceInfoList, i, &deviceInfoData); i++) {
if (deviceInterfaceDetailData) LocalFree(deviceInterfaceDetailData); …Run Code Online (Sandbox Code Playgroud) 以前,我曾使用具有以太网连接和不同 IP 地址的工业相机来进行多个相机设置。现在我正在尝试使用 OpenCV 进行多相机设置,但我不确定如何将 OpenCV VideoCaptureID 与特定相机相匹配。
我可能应该用我目前的情况作为例子来使我的问题更清楚。我目前连接了 3 个摄像头。如果重要的话,我正在使用 Ubuntu 18.04。这是我的输出lsusb(省略了除我连接的 3 个 Logitech 网络摄像头之外的所有内容):
$ lsusb
Bus 001 Device 013: ID 046d:0843 Logitech, Inc. Webcam C930e
Bus 001 Device 003: ID 046d:0843 Logitech, Inc. Webcam C930e
Bus 001 Device 006: ID 046d:0892 Logitech, Inc. OrbiCam
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我有 2C930e台和 1 台OrbiCam已连接。基于这篇非常有用的文章:
我发现我可以像这样获取摄像头的序列号:
$ sudo lsusb -v -d 046d:0843 | grep -i serial
iSerial 1 D2DF1D2E
iSerial 1 99A8F15E
$ sudo lsusb …Run Code Online (Sandbox Code Playgroud) 我的系统中有 3 个相同的相机在运行,它们之间的唯一区别是插入的 USB 端口。我需要使用 OpenCV 为每个摄像头加载一个特定的 Python 脚本,我的代码非常简单:
capture = cv2.VideoCapture(index)
Run Code Online (Sandbox Code Playgroud)
其中 index 在每个脚本中分别等于 0、1、2。当我重新启动 PC 并运行相同的代码时出现问题,有时会按预期运行,有时 1 或 2 个摄像头已切换其索引(未更改任何代码或从 USB 拔出),因此结果是在没有相应摄像头的情况下加载脚本。
例如,如果在 script2.py 中定义的相机索引为 2,那么我重新启动 PC,现在在运行 script2.py 时加载索引为 0 的相机。
对此有任何解决方案吗?如何指定 VideoCapture() 的物理端口始终相同?我运行的是Win10
提前致谢