在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路由器...