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盤。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章