作者:chunhuai | 来源:互联网 | 2023-09-12 17:32
WM_DEVICECHANGE使用方式有两种,一种是直接在Windows窗口回调函数中使用,另一种便需要自己注册一下,并编写On函数。第一种,在回调函数中添加“caseWM_DEVICECHAN
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 #i nclude #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}