📄 main.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 + -