方法一:依賴窗口
方法二:從註冊表入手
方法一:
由於USB存儲設備和SD卡都是存儲設備,
當設備接入的時候枚舉註冊表路徑"HKEY_LOCAL_MACHINE//Drivers//Active"下的子鍵,根據 p->dbcp_name;查找自檢中與此值匹配的項,查找該項的鍵項"Key"的值是否包含"Drivers//USB//ClientDrivers//Mass_Storage_Class"字段,如果包含則加入了USB存儲設備,若包含帶有SD的字段,則加入了SD卡設備
但是當設備移除的時候從註冊表裏已經找不到這些信息,唯一可行的就是要存儲註冊表項的內容,顯得比較麻煩,而且非得依賴窗口才能實現,在寫DLL的時候出現了一些問題,所以尋找下一種方法。
方法二:
思路:
1.枚舉註冊表路徑"HKEY_LOCAL_MACHINE//Drivers//Active"下的子鍵,
若該鍵的鍵項"Key"的值包含"Drivers//USB//ClientDrivers//Mass_Storage_Class",表示該設備爲USB設備;
若該鍵的鍵項"Key"的值包含"Drivers//SDCARD//ClientDrivers//Class",表示該設備爲SD卡設備;
規定,若未SD卡設備value = 1;若未USB存儲設備value = 0.
2.枚舉的時候採用從head插入,讀取的時候從鏈表頭開始讀,讀到某一項其鍵項"Key"的值既不代表USB存儲設備也不代表SD卡設備的時候停止。
存儲求得的和sum;
old_itemNameList = EnumActiveDir();
old_sum = Count(old_itemNameList);
3.監控註冊表項"HKEY_LOCAL_MACHINE,TEXT//Drivers//Active",此項發生變化說明有設備接入或者移除,當變化的時候重新枚舉並比較變化前後的結構體
cur_itemNameList = EnumActiveDir(); //PREG_ITEM_NAME EnumActiveDir()
compare(old_itemNameList, cur_itemNameList);//比較主要是查看兩個結構體子項的數目,如果old比cur大,說明有設備移除,反之有設備添加。
根據old和cur的差值來判斷是哪種類型的設備接入或者移除。
EnumActiveDir函數實現如下:
typedef struct __REG_ITEM_NAME
{
int num;//編號
char szItemName[MAX_PATH];//鍵值內容
__REG_ITEM_NAME *pNext;
} REG_ITEM_NAME, *PREG_ITEM_NAME;
PREG_ITEM_NAME EnumActiveDir();
#define REGITEMLEN sizeof(struct __REG_ITEM_NAME)
PREG_ITEM_NAME EnumActiveDir()
{
PREG_ITEM_NAME p,last,head;
HKEY hKey;
LONG lResult ;
TCHAR szKeyName[64] ;
if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("Drivers//Active"),0,0,&hKey))
{
int count=0;
head=last=NULL;
p = (PREG_ITEM_NAME)malloc(REGITEMLEN);
do
{
DWORD dwKeynameLength = MAX_PATH;
lResult = RegEnumKeyEx(hKey,count,szKeyName,&dwKeynameLength,0,NULL,NULL,NULL);
if(lResult != ERROR_SUCCESS)
{
break;
}
p->num = count;
strcpy(p->szItemName, wide2short(szKeyName));
p->pNext=NULL;
++count;
if(count == 1)
head=p;
else
last->pNext=p;
last=p;
p = (PREG_ITEM_NAME)malloc(REGITEMLEN);
} while (lResult != ERROR_NO_MORE_ITEMS);
RegCloseKey(hKey);
free(p);
return head;
}
return NULL;
}
compare函數實現如下:
void compare(PREG_ITEM_NAME old_itemNameStruct, PREG_ITEM_NAME cur_itemNameStruct){
PREG_ITEM_NAME old_struct = old_itemNameStruct;
PREG_ITEM_NAME cur_struct = cur_itemNameStruct;
int old_count = 0;
int cur_count = 0;
while(old_struct)
{
old_count++;
old_struct = old_struct->pNext;
}
while(cur_struct)
{
cur_count++;
cur_struct = cur_struct->pNext;
}
//還原指針指向
cur_struct = cur_itemNameStruct;
old_struct = old_itemNameStruct;
if((old_count>cur_count) && (old_count-cur_count == 1))//有設備移除
{
//取old的最上面一個
new_sum = Count(cur_struct);
if(new_sum == old_sum)
AfxMessageBox(L"USB設備移除");
else if(old_sum-new_sum == 1 )
AfxMessageBox(L"SD卡移除");
}
if((cur_count>old_count) && (cur_count-old_count == 1))//有新設備添加
{
new_sum = Count(cur_struct);
if(new_sum == old_sum)
AfxMessageBox(L"接入USB設備");
else if(new_sum-old_sum == 1 )
AfxMessageBox(L"接入SD卡");
}
old_itemNameList = cur_itemNameList;
old_sum = new_sum;
}