VC中检测USB状态的变化

启动VC,新建一个MFC的EXE程序,命名为USBListening,选择Dialog bassed,
其余默认,点击Finished
在绿字下面添加如下红色代码
/
// CUSBListeningDlg message handlers

// Author : isdong
#include "Dbt.h"
#include <malloc.h>
#include <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;
/*
USB dbcc_classguid  :{36FC9E60-C465-11CF-8056-444553540000}
可以在注册表中查询 HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Enum\USB\ROOT_HUB
此键值下面有你的设备列表你可以查到的,只能用那个*/

    *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
}
***若xp编译不通过,提示  DEV_BROADCAST_DEVICEINTERFACE类型的变量未被定义 在stdafx.h中定义
#ifndef WINVER                // 允许使用 Windows 95 和 Windows NT 4 或更高版本的特定功能。
#define WINVER 0x0500        //为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
#endif
PS:==================================================================================
如果是动态监测,即监测U盘插入可以通过监听WM_DEVICECHANGE消息来实现,并从WM_DEVICECHANGE消息的lParam里获取盘符。

如果是静态检测,即U盘已经插入,可以通过WinAPI GetDriveType 获得驱动器类型。用一个循环判断所有当前驱动器(结合GetLogicalDriveStrings),如果类型为DRIVE_REMOVABLE,则该驱动器为U盘。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值