檢測USB和SD卡存放裝置的接入和移除

來源:互聯網
上載者:User

方法一:依賴視窗

方法二:從註冊表入手

 

 

方法一:

 

 

由於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;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.