MFC实现设备的插拔检测

来源:互联网 发布:js隐藏显示tr 编辑:程序博客网 时间:2024/04/30 03:14

这里主要利用CWnd的ON_WM_DECICECHANGE消息来处理,这个消息需要手动添加,而且只有顶层窗口可以捕捉到.这个需要手动添加 消息
1、添加消息映射
BEGIN_MESSAGE_MAP(CMFCApplicationTestDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
……
ON_WM_DEVICECHANGE()//添加消息映射
……

END_MESSAGE_MAP()
2 添加头文件:
#include “dbt.h”
3**重点内容**、添加函数(.h文件中)

在窗口类当中添加如下消息响应函数
afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD dwData);

protected:

HICON m_hIcon;

// 生成的消息映射函数
afx_msg void
OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
public:
afx_msg void OnBnClickedCancel();
afx_msg BOOL OnDeviceChange(UINT nEventType, DWORD_PTR dwData);//系统的插拔函数

4、实现
BOOL CFileCopyDlg::OnDeviceChange(UINT nEventType, DWORD dwData)
{
DEV_BROADCAST_DEVICEINTERFACE* dbd = (DEV_BROADCAST_DEVICEINTERFACE*)dwData;

//这里进行信息匹配,比如guid等
//针对各个事件进行处理.
switch (nEventType)
{
case DBT_DEVICEREMOVECOMPLETE://设置移除
if (bFindRemovableDevice)
{
MessageBox(_T(“移除USB”));
bFindRemovableDevice = FALSE;
}
break;
case DBT_DEVICEARRIVAL://设备插入

if (!bFindRemovableDevice)
{
bFindRemovableDevice = TRUE;
MessageBox(_T(“发现USB”));
}
break;
default:
break;
}

return TRUE;
}

5、注册设备OnInitDialog()

DEV_BROADCAST_DEVICEINTERFACE DevBroadcastDeviceInterface;
memset(&DevBroadcastDeviceInterface, 0, sizeof(DEV_BROADCAST_DEVICEINTERFACE));
DevBroadcastDeviceInterface.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
DevBroadcastDeviceInterface.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
DevBroadcastDeviceInterface.dbcc_classguid = { 0xA5DCBF10, 0x6530, 0x11D2,{ 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };
RegisterDeviceNotification(this->GetSafeHwnd(), &DevBroadcastDeviceInterface, DEVICE_NOTIFY_WINDOW_HANDLE);