使用C检测USB插入/删除事件在Windows ++ [英] Detecting USB Insertion / Removal Events in Windows using C++
问题描述
我写了需要处理的USB插入/移除事件的现有应用程序的扩展。我知道,感兴趣的设备的VID / PID。但是,我没有进入窗口句柄,所以我不知道,如果 RegisterDeviceNotification
将是多大用处,除非有办法通过获取手柄在 WINAPI
。什么是检测与C USB插入/拔出事件的最好办法++?
I am writing an extension for an existing application that needs to handle USB insertion/removal events. I know the VID/PID of the device of interest. However, I don't have access to the window handle, so I don't know if RegisterDeviceNotification
will be of much use, unless there is a way to obtain the handle via the WINAPI
. What would be the best way to detect USB insertion/removal events with C++?
This sample code on the Microsoft website shows how to receive event notifications via WMI:
怎么可能进行修改,以获得USB插入/删除事件?或者,是否有另一种方式我应该去这件事?我使用Visual Studio 2008中感谢。
How could it be modified to receive USB insertion/removal events? Or, is there another way I should be going about this? I am using Visual Studio 2008. Thanks.
的 其他信息的
ADDITIONAL INFO
这是我到目前为止(减去错误处理):
This is what I have so far (minus error-handling):
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 );
// Register the USB device for notification
_pDevIF = (DEV_BROADCAST_DEVICEINTERFACE *)malloc( sizeof(DEV_BROADCAST_DEVICEINTERFACE) );
memset( _pDevIF, 0, sizeof(DEV_BROADCAST_DEVICEINTERFACE) );
_pDevIF->dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
_pDevIF->dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
_pDevIF->dbcc_classguid = GUID_INTERFACE_CP210x;
_hNotifyDevNode = RegisterDeviceNotification( _hWnd, _pDevIF, DEVICE_NOTIFY_WINDOW_HANDLE );
}
static bool OnDeviceChange(UINT nEventType, DWORD dwData)
{
switch ( nEventType )
{
case DBT_DEVICEARRIVAL:
// A device has been inserted adn is now available.
break;
case DBT_DEVICEREMOVECOMPLETE:
// Device has been removed.
break;
default:
break;
}
return true;
}
static LRESULT WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
switch ( message )
{
case WM_DEVICECHANGE:
OnDeviceChange( wParam, lParam ); // Set breakpoint (never gets here)
break;
default:
break;
}
return DefWindowProc(hwnd, message, wParam, lParam);
}
在PC进入的WndProc
,而不是当我删除/插入我的USB设备。电脑似乎从来没有进入 OnDeviceChange
。任何提示将AP preciated。我需要使用USB设备的意外插入/清除。如果它的确与众不同,USB设备将显示为一个虚拟COM端口到Windows。谢谢你。
The PC gets into WndProc
, but not when I remove/insert my USB device. The PC never seems to get into OnDeviceChange
. Any tips would be appreciated. I need to handle unexpected insertions/removals of the USB device. If it makes a difference, the USB device appears as a virtual COM port to Windows. Thanks.
aditional的信息:电话函数CreateWindowEx
使用类原子
按<$ C返回$ C> RegisterClassEx 失败,出现错误消息找不到窗口类。
Aditional info: Calling CreateWindowEx
using the class atom
returned by RegisterClassEx
fails with the error message, "Cannot find window class."
_hWnd = CreateWindowEx( 0, (LPCTSTR)&atom, pWindowName, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL );
新方法的
NEW APPROACH
我也想这种新的方法。我试图让写一个唯一的消息窗口,为USB设备接收设备更改通知消息。我使用MFC,C ++和Visual Studio 2008中的一切编译并运行没有崩溃或锁定,但该事件处理程序永远不会触发。感兴趣的设备上安装Windows作为一个虚拟COM端口。
I'm also trying this new approach. I'm trying to get write a message-only window to receive device change notification messages for a USB device. I am using MFC, C++, and Visual Studio 2008. Everything compiles, and it runs without crashing or locking up, but the event handler is never triggered. The device of interest is installed on Windows as a virtual COM port.
我的主要应用程序实例下面接着介绍了该类等待使用while循环键盘轮询输入的字符。正是在这个等待时间,我插拔USB设备预期的事件被炒鱿鱼。
My main application instantiates the class described below then waits for a character input from the keyboard polling using a while loop. It is during this wait time that I remove and insert my USB device expecting the event to get fired.
class CMessageOnlyWindow : public CWnd
{
DECLARE_DYNAMIC(CMessageOnlyWindow)
private:
DEV_BROADCAST_DEVICEINTERFACE * _pDevIF; // The notification filter.
HDEVNOTIFY _hNotifyDev; // The device notification handle.
public:
CMessageOnlyWindow();
virtual ~CMessageOnlyWindow();
protected:
afx_msg BOOL OnDeviceChange( UINT nEventType, DWORD dwData );
private:
void RegisterNotification( void );
void UnregisterNotification( void );
protected:
DECLARE_MESSAGE_MAP() // Must be last.
};
为了简单起见,我已经删除了所有的清理和错误处理:
For simplicity, I've removed all the cleanup and error-handling:
DEFINE_GUID(GUID_INTERFACE_CP210x, 0x993f7832, 0x6e2d, 0x4a0f, \
0xb2, 0x72, 0xe2, 0xc7, 0x8e, 0x74, 0xf9, 0x3e);
IMPLEMENT_DYNAMIC(CMessageOnlyWindow, CWnd)
CMessageOnlyWindow::CMessageOnlyWindow()
{
CString cstrWndClassName = ::AfxRegisterWndClass( NULL );
BOOL bCreated = this->CreateEx( 0, cstrWndClassName,
L"CMessageOnlyWindow", 0, 0, 0, 0, 0, HWND_MESSAGE, 0 );
this->RegisterNotification();
}
CMessageOnlyWindow::~CMessageOnlyWindow() {}
BEGIN_MESSAGE_MAP(CMessageOnlyWindow, CWnd)
ON_WM_DEVICECHANGE()
END_MESSAGE_MAP()
afx_msg BOOL CMessageOnlyWindow::OnDeviceChange( UINT nEventType, DWORD dwData )
{
switch ( nEventType ) // <-- Never gets here.
{
case DBT_DEVICEARRIVAL:
break;
case DBT_DEVICEREMOVECOMPLETE:
break;
default:
break;
}
return TRUE;
}
void CMessageOnlyWindow::RegisterNotification(void)
{
_pDevIF = (DEV_BROADCAST_DEVICEINTERFACE *)malloc( sizeof(DEV_BROADCAST_DEVICEINTERFACE) );
memset( _pDevIF, 0, sizeof(DEV_BROADCAST_DEVICEINTERFACE) );
_pDevIF->dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
_pDevIF->dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
_pDevIF->dbcc_classguid = GUID_INTERFACE_CP210x;
_hNotifyDev = RegisterDeviceNotification( this->m_hWnd, _pDevIF, DEVICE_NOTIFY_WINDOW_HANDLE );
}
void CMessageOnlyWindow::UnregisterNotification(void)
{
UnregisterDeviceNotification( _hNotifyDev );
}
任何想法或建议将是多少AP preciated。如果任何细节丢失,让我知道了,我会很乐意添加。谢谢你。
Any thoughts or suggestions would be much appreciated. If any details are missing, let me know, and I will be glad to add them. Thanks.
请问仅邮件窗口需要一个新的线程来启动,还是自动创建一个新的窗口分拆一个新线程?
Does the message-only window need to be started in a new thread, or does creating a new window automatically spin off a new thread?
推荐答案
创建一个虚拟窗口,什么也不做,而是要等待 WM_DEVICECHANGE
,并使用寄存器窗口 RegisterDeviceNotification
。 WMI是一种矫枉过正这里,恕我直言。
Create a dummy window that does nothing but wait for WM_DEVICECHANGE
and register that window using RegisterDeviceNotification
. WMI is an overkill here, IMHO.
这篇关于使用C检测USB插入/删除事件在Windows ++的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!