VC中检测USB状态的变化 (zz)

来源:互联网 发布:tpshop源码 编辑:程序博客网 时间:2024/05/18 03:45
 

本代码可以监测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;
 /*
 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
}