⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.cpp

📁 Monitor Device Change Message INclude Mass Storage ,HID,USB Audio Devices
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
#include <stdio.h>
#include <string>
#include <vector>
#include <dbt.h>
#include <HIDSDI.H>
#include <initguid.h>
#include <setupapi.h>
DEFINE_GUID(GUID_CLASS_USBAUDIO,
0x6994AD04,0x93ef,0x11d0,0xa3,0xcc,0x00,0xa0,0xc9,0x22,0x31,0x96);
//{6994AD04-93EF-11D0-A3CC-00A0C9223196}
DEFINE_GUID( GUID_CLASS_INPUT, 0x4D1E55B2L, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, \
             0x11, 0x11, 0x00, 0x00, 0x30);
//---------------------------------------------------------------------------
__fastcall TMainForm::TMainForm(TComponent* Owner)
        : TForm(Owner)
{
 dwConChangeCancel=0;
 dwConChanged=0;
 dwQueryRemoved=0;
 dwQueryRemoveFailed=0;
 dwRemovePending=0;
 dwSpecific=0;
 dwQueryChangeConfig=0;
 dwDevArrivel=0;
 dwDevRemoved=0;
 dwDevNodeChange=0;
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::WndProc(TMessage &Message)
{
    if(Message.Msg == WM_DEVICECHANGE){
       switch(Message.WParam){
       case DBT_CONFIGCHANGECANCELED:
            LB_ConfigChangeCanceled->Caption=++dwConChangeCancel;
            break;
       case DBT_CONFIGCHANGED:
            LB_ConfigChanged->Caption=++dwConChanged;
            break;
       case DBT_DEVICEQUERYREMOVE:
            LB_QueryRemoved->Caption=++dwQueryRemoved;
            break;
       case DBT_DEVICEQUERYREMOVEFAILED:
            LB_QueryRemoveFailed->Caption=++dwQueryRemoveFailed;
            break;
       case DBT_DEVICEREMOVEPENDING:
            LB_RemovePending->Caption=++dwRemovePending;
            break;
       case DBT_DEVICETYPESPECIFIC:
            LB_Specific->Caption=++dwSpecific;
            break;
       case DBT_QUERYCHANGECONFIG:
            LB_QueryChangeConfig->Caption=++dwQueryChangeConfig;
            break;
       case DBT_USERDEFINED:
            break;
       case DBT_DEVICEARRIVAL:
            LB_Arrival->Caption=++dwDevArrivel;
            ParseDBTHeader(Message.LParam);
            break;
       case DBT_DEVICEREMOVECOMPLETE:
            LB_Removed->Caption=++dwDevRemoved;
            ParseDBTHeader(Message.LParam);            
            break;
       case DBT_DEVNODES_CHANGED:
            LB_NodeChange->Caption=++dwDevNodeChange;
            break;
       }

    }

    TForm::WndProc(Message);
}
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
 dwConChangeCancel=0;
 dwConChanged=0;
 dwQueryRemoved=0;
 dwQueryRemoveFailed=0;
 dwRemovePending=0;
 dwSpecific=0;
 dwQueryChangeConfig=0;
 dwDevArrivel=0;
 dwDevRemoved=0;
 dwDevNodeChange=0;


 LB_ConfigChangeCanceled->Caption=0;
 LB_ConfigChanged->Caption=0;
 LB_QueryRemoved->Caption=0;
 LB_QueryRemoveFailed->Caption=0;
 LB_RemovePending->Caption=0;
 LB_Specific->Caption=0;
 LB_QueryChangeConfig->Caption=0;
 LB_Arrival->Caption=0;
 LB_Removed->Caption=0;
 LB_NodeChange->Caption=0;
}
//---------------------------------------------------------------------------


void __fastcall TMainForm::FormShow(TObject *Sender)
{
 Button1Click(NULL);
}
//---------------------------------------------------------------------------

void __fastcall TMainForm::RegHIDButtonClick(TObject *Sender)
{
GUID hidGuid;
DEV_BROADCAST_DEVICEINTERFACE deviceFilter;
GetHidGuid(&hidGuid);
deviceFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
deviceFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
deviceFilter.dbcc_reserved = 0;
deviceFilter.dbcc_classguid = hidGuid;
deviceFilter.dbcc_name[0] = 0;
RegisterDeviceNotification(Handle, &deviceFilter,DEVICE_NOTIFY_WINDOW_HANDLE);
}
//---------------------------------------------------------------------------

typedef void (CALLBACK * LPHidD_GetHidGuid)(OUT LPGUID);
void TMainForm::GetHidGuid(PGUID pGUID)
{
   HANDLE hHidDll;
   LPHidD_GetHidGuid GetHidGuidFun;
   hHidDll= LoadLibrary("HID.dll");
   if (hHidDll == NULL)
       return;

   GetHidGuidFun= (LPHidD_GetHidGuid) GetProcAddress(hHidDll,"HidD_GetHidGuid");
   GetHidGuidFun(pGUID);
   FreeLibrary(hHidDll);
}
void __fastcall TMainForm::BitBtn1Click(TObject *Sender)
{
DEV_BROADCAST_DEVICEINTERFACE deviceFilter;
deviceFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
deviceFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
deviceFilter.dbcc_reserved = 0;
deviceFilter.dbcc_classguid = GUID_CLASS_USBAUDIO;
deviceFilter.dbcc_name[0] = 0;
RegisterDeviceNotification(Handle, &deviceFilter,DEVICE_NOTIFY_WINDOW_HANDLE);

}
//---------------------------------------------------------------------------

void TMainForm::ParseDBTHeader(LPARAM lParam)
{
 int i;
 char strmsg[256]="";
 char strtmp[64]="";
 PDEV_BROADCAST_HDR lpdb = (PDEV_BROADCAST_HDR)lParam;
 PDEV_BROADCAST_DEVICEINTERFACE lpdi;
 PDEV_BROADCAST_VOLUME lpdv;
 DWORD dwDriveMask;
 switch(lpdb->dbch_devicetype)
 {
 case DBT_DEVTYP_DEVICEINTERFACE:
      lpdi=(PDEV_BROADCAST_DEVICEINTERFACE)lParam;
      strcat(strmsg,"Class Device->");
      if(GUID_CLASS_INPUT==lpdi->dbcc_classguid){
         strcat(strmsg,"(HID):");
         strcpy(strmsg,"Name:");
         strcat(strmsg,lpdi->dbcc_name);
         StatusBar1->Panels->Items[0]->Text=strmsg;
      }

      break;
 case DBT_DEVTYP_VOLUME:
      lpdv=(PDEV_BROADCAST_VOLUME)lParam;
      strcat(strmsg,"Volume Device->");
      if(DBTF_MEDIA!=lpdv->dbcv_flags){
         dwDriveMask=lpdv->dbcv_unitmask;
         strcat(strmsg,"(Storage):");
         for(i=0;i<26;i++){
             if(dwDriveMask&0x01){
                sprintf(strtmp,"%C: ",'A'+i);
                strcat(strmsg,strtmp);
             }
             dwDriveMask>>=1;
         }
      }
      StatusBar1->Panels->Items[0]->Text=strmsg;
      break;

 }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -