ATL可执行文件(.exe)监控USB插拔状态
2013-10-18 17:30
393 查看
OnDeviceChange(ON_WM_DEVICECHANGE)
1.添加消息
1.消息映射
BEGIN_MESSAGE_MAP(CAFT_1394Dlg, CDialog) //{{AFX_MSG_MAP(CAFT_1394Dlg) ON_WM_PAINT() ON_WM_QUERYDRAGICON() ... ON_WM_DEVICECHANGE() //}}AFX_MSG_MAP
2.声明消息响应函数
afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);
3.定义函数内容:
BOOL XXXXXXX::OnDeviceChange(UINT nEventType,DWORD dwData) { DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*) dwData; //这里进行信息匹配,比如guid等 //针对各个事件进行处理. switch (nEventType) { case DBT_DEVICEREMOVECOMPLETE: ... break; case DBT_DEVICEARRIVAL: ... break; ... ... ... default: break; } return TRUE; }
2.注册设备
if (Handle == NULL) return FALSE; DEV_BROADCAST_DEVICEINTERFACE DevInt; memset(&DevInt,0,sizeof(DEV_BROADCAST_DEVICEINTERFACE)); DevInt.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); DevInt.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; DevInt.dbcc_classguid = GetCurrentUSBGUID();//m_usb->GetDriverGUID(); if (!RegisterDeviceNotification(m_hWnd, &DevInt,DEVICE_NOTIFY_WINDOW_HANDLE) ) return FALSE;
只有注册了该设备,OnDeviceChange才能获得详细的信息,否则收到的参数都是0007.
ATL可执行文件(.exe)监控USB
麻烦的地方在于,只能在窗口程序或者是服务程序中才能这么做,但是ATL程序中,如果程序类型不是服务的话,比如是一个可执行文件(.exe),又如何实现呢?1,在Com接口类中创建MsgWnd类
class MsgWnd : public CDialog { public: MsgWnd() {} MsgWnd( CComExecute* p ); ~MsgWnd() {} protected: afx_msg LRESULT OnRecvMsg(WPARAM wParam, LPARAM lParam); //消息函数 afx_msg BOOL OnDeviceChange(UINT nEventType,DWORD_PTR dwData ); DECLARE_MESSAGE_MAP() private: MsgWnd(const MsgWnd&); MsgWnd& operator=(const MsgWnd&); CComExecute* m_pParent; public: //注册 void RegisterUSBGUID(); };
需要包含头文件
#ifdef _WINDOWS_ #undef _WINDOWS_ #include <afxwin.h> #endif
2,实现MsgWnd类
HDEVNOTIFY gNotifyDevHandle = NULL; DEFINE_GUID(GUID_DEVINTERFACE_USB_DEVICE, 0xA5DCBF10L, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED); BEGIN_MESSAGE_MAP(MsgWnd, CWnd) //ON_MESSAGE(WM_COMM, OnRecvMsg) ON_WM_DEVICECHANGE() END_MESSAGE_MAP() LRESULT MsgWnd::OnRecvMsg(WPARAM wPar, LPARAM lPar) { if ( NULL != m_pParent ) { } return 1; } MsgWnd::MsgWnd( CComExecute* p ) { if ( NULL != p ) { m_pParent = p; } } void MsgWnd::RegisterUSBGUID() { DEV_BROADCAST_DEVICEINTERFACE broadcastInterface = {0}; // Register to receive notification when a USB device is plugged in. broadcastInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); broadcastInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; memcpy( &(broadcastInterface.dbcc_classguid), &(GUID_DEVINTERFACE_USB_DEVICE), sizeof(struct _GUID)); gNotifyDevHandle = RegisterDeviceNotification(m_hWnd, &broadcastInterface, DEVICE_NOTIFY_WINDOW_HANDLE); } //check device event,WM_DEVICECHANGE BOOL MsgWnd::OnDeviceChange(UINT nEventType,DWORD_PTR dwData ) { //analysing the event CString strDisk,strError; //PDEV_BROADCAST_HDR pHdr = (PDEV_BROADCAST_HDR)lParam; DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*) dwData; //check device event switch(nEventType) { case DBT_DEVICEARRIVAL://设备检测结束 并且可以使用 { //CheckDeviceType(pHdr,wParam); int a = 0; m_pParent->TestAAA(); break; } case DBT_DEVICEREMOVECOMPLETE://DBT_DEVICEREMOVECOMPLETE,设备卸载或者拔 { //CheckDeviceType(pHdr,wParam); int b = 0; m_pParent->TestBBB(); break; } break; case DBT_DEVICEQUERYREMOVE: break; case DBT_DEVICEQUERYREMOVEFAILED: break; case DBT_DEVICEREMOVEPENDING: break; case DBT_DEVICETYPESPECIFIC: break; case DBT_CUSTOMEVENT: break; case DBT_QUERYCHANGECONFIG: break; case DBT_CONFIGCHANGED: break; case DBT_CONFIGCHANGECANCELED: break; case DBT_MONITORCHANGE: break; case DBT_SHELLLOGGEDON: break; case DBT_CONFIGMGAPI32: break; case DBT_VXDINITCOMPLETE: break; case DBT_VOLLOCKQUERYLOCK: break; case DBT_VOLLOCKLOCKTAKEN: break; case DBT_VOLLOCKLOCKFAILED: break; case DBT_VOLLOCKQUERYUNLOCK: break; case DBT_VOLLOCKLOCKRELEASED: break; case DBT_VOLLOCKUNLOCKFAILED: break; case DBT_NO_DISK_SPACE: break; case DBT_LOW_DISK_SPACE: break; case DBT_CONFIGMGPRIVATE: break; case DBT_USERDEFINED: break; default: break; } return true; }
需要添加头文件
#include <Dbt.h> #include <Initguid.h>
3,Com接口类创建Dialog
if ( NULL == m_pMsgWnd ) { m_pMsgWnd = new MsgWnd( this ); BOOL bRet = m_pMsgWnd->CreateEx(WS_EX_CLIENTEDGE,_T("Message"), _T("Message"),WS_OVERLAPPED,0,0,0,0,HWND_DESKTOP,NULL); if ( bRet ) { m_pMsgWnd->RegisterUSBGUID(); } }
OK,在客户端调用后,这个exe就会运行,并且可以检测到USB的插拔动作
相关文章推荐
- Android4.2蓝牙基础架构学习
- 用Virtualbox搭建LAMP环境-2.安装Apache server
- opencv 低通滤波器
- OpenGL 的选择模式
- linux设备模型之内核集合、内核对象
- 实战Linux Shell 编程与服务器管理
- 如何去掉linux环境中C++代码中的^M,文件一般来自windows 下编辑的c++代码。
- optimizer_相关参数
- linux 某些命令的安装
- nginx通过ngx_array_push()获取handler
- linux0.01 引导启动过程
- php调用shell脚本--126错误
- property 等
- linux vps 配置搭建java服务器环境(jdk+tomcat+mysql)
- LDAP学习笔记<三>深入管理openLDAP
- CentOS最小化安装后续工作
- 多台linux服务器ssh相互无密码访问
- linux性能调优
- Linux 下记录工具(history,screen,script)使用
- LDAP学习笔记<二>图文介绍openLDAP在windows上的安装配置