Windows平台C 啟用和禁用裝置

2021-08-17 08:10:17 字數 3028 閱讀 7882

在windows平台上有一套setupdi系列api可以獲取所有的硬體裝置,以及對其進行操作。現在我來主要說一下對指定裝置的啟用和禁用操作。

首先說明一下,我的專案是個mfc對話方塊程式,我自己定義了乙個結構體用來存放相關的裝置資訊

typedef struct tagdeviceinfo

else

}}deviceinfo;

接著是進行裝置的列舉,並將其資訊儲存在我的容器中

(ps: 函式裡的printerror函式是我自定義的乙個輸出錯誤碼的函式,大家可以無視和注釋掉)

bool deviceopt::getdevicelist(lpguid lpguid)

deviceinfo theitem;

// 迴圈列舉

deviceinfodata.cbsize = sizeof(sp_devinfo_data);

for (i = 0; setupdienumdeviceinfo(hdevinfo, i, &deviceinfodata); i++)

; tchar szdescbuf[max_path] = ;

tchar szdriver[max_path] = ;

tchar szfriname[max_path] = ;

// 獲取類名

if (!setupdigetdeviceregistryproperty(hdevinfo, &deviceinfodata, spdrp_class, null, (pbyte)szclassbuf, max_path - 1, null))

theitem.szdeviceclass = szclassbuf;

//獲取裝置描述資訊

if (!setupdigetdeviceregistryproperty(hdevinfo, &deviceinfodata, spdrp_devicedesc, null, (pbyte)szdescbuf, max_path - 1, null))

theitem.szdevicedesc = szdescbuf;

//獲取裝置驅動名

if (!setupdigetdeviceregistryproperty(hdevinfo, &deviceinfodata, spdrp_driver, null, (pbyte)szdriver, max_path - 1, null))

theitem.szdrivername = szdriver;

//獲取裝置友好名

if (!setupdigetdeviceregistryproperty(hdevinfo, &deviceinfodata, spdrp_friendlyname, null, (pbyte)szfriname, max_path - 1, null))

//error_insufficient_buffer

theitem.szdevicename = szfriname;

theitem.dwdevins = deviceinfodata.devinst;

theitem.guid = deviceinfodata.classguid;

thedevicelist.push_back (theitem);

}

// 釋放

setupdidestroydeviceinfolist(hdevinfo);

sort(thedevicelist.begin (),thedevicelist.end (), less());

} while (false);

return bflag;

}

這裡要說明一下引數是我要獲取的裝置的型別名,這是個guid型別的所有裝置類都定義在devguid.h中,具體情況看你想要什麼型別的裝置,如果想要列舉所有裝置,引數應該像下面這個填寫。

setupdigetclassdevs(null, 0, 0, digcf_present | digcf_allclasses );
可以看到我獲取了裝置的類名,描述資訊,驅動名,裝置友好名,以及所屬類guid和裝置例項(deviceinfodata.devinst),

之所以儲存了這個裝置例項是因為在後面的啟用操作中,當我想要啟用乙個我程式禁用掉的裝置時,發現裝置列表竄位了,當我啟動當前裝置上面的乙個裝置時,我禁用的裝置才能正確啟動。所以我儲存這個例項以便我能找到正確的裝置。

下面是我啟用/禁用的函式實現

//設定裝置狀態(啟用/停用),1為啟用,0為停用

bool deviceopt::setdevicestatus(deviceinfo &thedevice,bool bstatusflag)

//判斷是否有這個裝置

bflag = false;

int index = 0;

while (setupdienumdeviceinfo(hdevinfo, index ++, &deviceinfodata))

}if (!bflag)

else

}else

}// 釋放

setupdidestroydeviceinfolist(hdevinfo);

} while (false);

return bflag;

}

引數分別是乙個裝置資訊的引用(實際需要的資訊只有裝置類 和裝置例項),和乙個啟用/禁用標誌,

propchange.statechange = bstatusflag ? dics_start: dics_stop;

在上面的**部分就是判斷是啟用還是禁用。

還有個問題是系統win 64位的時候如果程式是32位的話會提示錯誤,得需要將程式版本改為64位才可以正常執行。

ps:上面這個問題已經解決了,使用setupdichangestate 這個api就可以實現32位的程式操作64位系統的裝置,不過需要注意的是使用這個api禁用的裝置無法使用裝置管理器啟用,只能通過這個api再把狀態改回去,所以請慎用!!

網絡卡禁用和啟用

2010 11 10 21 34 23 include include include setupapi.h include objbase.h include pragma comment lib,setupapi.lib void enumdevices hdevinfo hdevinfo lp...

Qt之Windows下禁用和啟用中文輸入法

在密碼框輸入密碼的時候,一般要輸入字母 數字或者其他特殊字元,如果當前輸入法是中文輸入法,比如說搜狗拼音中文,需要手動切換成英文輸入法,非常麻煩。如果能在密碼框獲取到焦點的時候,將輸入法切換到美式英語 在密碼框失去焦點的時候,將輸入法還原到之前的狀態,就能解決該問題了。只使用qt是無法實現禁用和啟用...

BGP 啟用和禁用同步

bgp規定 為了防止路由環路,bgp路由器不通告從ibgp鄰居得到的路由。因此,如果bgp網路沒有實現全互聯,那麼直接相連的ibgp鄰居與非直接相連的ibgp鄰居的路由表不可能保持一致。在非全互聯ibgp網路中,將bgp路由重分發到igp中,當igp已經將這些路由通告到本自主系統的全部ibgp路由器...