WM_DEVICECHANGE使用方式有两种,一种是直接在Windows窗口回调函数中使用,另一种便需要自己注册一下,并编写On函数。
第一种,在回调函数中添加“case WM_DEVICECHANGE:”,并且可以直接判断wParam,如下。
switch (wParam)
在其中便可判断了,当然需要自己写相应代码,李木所写程序展示如下,这便是一个最基本的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
}