VC WM_DEVICECHANGE消息,实时捕获U盘插入、移除

 

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
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值