WM_DEVICECHANGE使用方式有两种,一种是直接在Windows窗口回调函数中使用,另一种便需要自己注册一下,并编写On函数。
第一种,在回调函数中添加“case WM_DEVICECHANGE:”,并且可以直接判断wParam,如下。
switch (wParam)
{ case DBT_DEVICEARRIVAL: case DBT_DEVICEREMOVECOMPLETE:} 在其中便可判断了,当然需要自己写相应代码,李木所写程序展示如下,这便是一个最基本的U盘检测程序,能够实时检测U盘的插入、卸载,并获得U盘的盘符,显示出来。
1、在Dialog.cpp中新增消息。 BEGIN_MESSAGE_MAP(CDeviceMonitorDlg, CDialog) ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_WM_DEVICECHANGE() END_MESSAGE_MAP() 2、新增响应函数。 DECLARE_MESSAGE_MAP() public: afx_msg BOOL OnDeviceChange(UINT nEventType,DWORD dwData); BOOL CTestDlg::OnDeviceChange(UINT nEventType,DWORD dwData) { DEV_BROADCAST_DEVICEINTERFACE * dbd = (DEV_BROADCAST_DEVICEINTERFACE*) dwData; switch(nEventType) { case DBT_DEVICEARRIVAL: MessageBox("Device arrival!"); break; case DBT_DEVICEQUERYREMOVE: // Handle device removal request MessageBox( "Device request remove!"); break; case DBT_DEVICEREMOVECOMPLETE: // Handle device removal MessageBox( "Device removal!" ); break; default: MessageBox("others!"); break; } return TRUE; }
第二种自己定义:
本代码可以监测USB状态的变化
启动VC,新建一个MFC的EXE程序,命名为USBListening,选择Dialog bassed,
其余默认,点击Finished
在绿字下面添加如下红色代码
在绿字下面添加如下红色代码 / // CUSBListeningDlg message handlers #i nclude "Dbt.h" #i nclude <malloc.h> #i nclude <Rpcdce.h> #pragma comment(lib,"Rpcrt4.lib") PVOID g_hNotifyDevNode; void CUSBListeningDlg::RegisterForDevChange(HWND hDlg, PVOID *hNotifyDevNode) { DEV_BROADCAST_DEVICEINTERFACE *pFilterData = (DEV_BROADCAST_DEVICEINTERFACE*) _alloca(sizeof(DEV_BROADCAST_DEVICEINTERFACE)); ASSERT (pFilterData); UUID GUID_CLASS_INPUT; UuidFromString((unsigned char*)"36FC9E60-C465-11CF-8056-444553540000", &GUID_CLASS_INPUT); ZeroMemory(pFilterData, sizeof(DEV_BROADCAST_DEVICEINTERFACE)); pFilterData->dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); pFilterData->dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; pFilterData->dbcc_classguid = GUID_CLASS_INPUT; *hNotifyDevNode = RegisterDeviceNotification(hDlg, pFilterData, DEVICE_NOTIFY_WINDOW_HANDLE); } //使用向导,添加DefWindowProc函数 LRESULT CUSBListeningDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DEVICECHANGE: { switch (wParam) { case DBT_DEVICEARRIVAL: // Handle device arrival MessageBox("Handle device arrival"); break; case DBT_DEVICEQUERYREMOVE: // Handle device removal request MessageBox("Handle device removal request"); break; case DBT_DEVICEREMOVECOMPLETE: // Handle device removal MessageBox("Handle device removal"); break; } } } return CDialog::DefWindowProc(message, wParam, lParam); } //在OnInitDialog函数中添加RegisterForDevChange函数 BOOL CUSBListeningDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here RegisterForDevChange(m_hWnd,&g_hNotifyDevNode); return TRUE; // return TRUE unless you set the focus to a control }
VC WM_DEVICECHANGE消息,实时捕获U盘插入、移除
最新推荐文章于 2021-07-08 15:31:59 发布