#include <iostream> #include <memory> //std::unique_ptr头文件 #include <string> #include <vector> //核心头文件 #include <Windows.h> #include <SetupAPI.h> using namespace std; typedef struct _MY_SP_DEVINFO_DATA { HDEVINFO hDevInfo; SP_DEVINFO_DATA devInfoData; } MY_SP_DEVINFO_DATA; //函数声明 HDEVINFO getClassDevs(const wstring &str); vector<MY_SP_DEVINFO_DATA> enumAllDevInfoData(const HDEVINFO &hDevInfo); string getDevInstanceId(MY_SP_DEVINFO_DATA &myDevInfoData); BOOL controlDevice(MY_SP_DEVINFO_DATA &myDevInfoData, DWORD controlCode); BOOL controlDevice(HDEVINFO hDevInfo, PSP_DEVINFO_DATA pDevInfoData, DWORD controlCode); int main() { std::cout << "hello world!" << endl; HDEVINFO hDevInfoUsb = getClassDevs(L"Usb"); HDEVINFO hDevInfoMouse = getClassDevs(L"Mouse"); HDEVINFO hDevInfoKeyboard = getClassDevs(L"Keyboard"); vector<MY_SP_DEVINFO_DATA> devInfoDataUsbList = enumAllDevInfoData(hDevInfoUsb); vector<MY_SP_DEVINFO_DATA> devInfoDataMouseList = enumAllDevInfoData(hDevInfoMouse); vector<MY_SP_DEVINFO_DATA> devInfoDataKeyboardList = enumAllDevInfoData(hDevInfoKeyboard); //将这些设备放到一个vector中 vector<MY_SP_DEVINFO_DATA> allDevInfoDataList; allDevInfoDataList.insert(allDevInfoDataList.end(), devInfoDataUsbList.begin(), devInfoDataUsbList.end()); allDevInfoDataList.insert(allDevInfoDataList.end(), devInfoDataMouseList.begin(), devInfoDataMouseList.end()); allDevInfoDataList.insert(allDevInfoDataList.end(), devInfoDataKeyboardList.begin(), devInfoDataKeyboardList.end()); //打印instanceId for(int i = 0; i < allDevInfoDataList.size(); ++i) { std::cout << getDevInstanceId(allDevInfoDataList.at(i)) << endl; } /* * 以鼠标为例,启用(或禁用) */ //启用 //controlDevice(devInfoDataMouseList.at(0), DICS_ENABLE); //禁用 controlDevice(devInfoDataMouseList.at(0), DICS_DISABLE); return 0; } HDEVINFO getClassDevs(const wstring &str) { BOOL success = FALSE; GUID classGuid; DWORD requiredSize = 0; HDEVINFO hDevInfo = INVALID_HANDLE_VALUE;
WCHAR buf[256] = {0};
wmemcpy_s(buf, 256, str.c_str(), str.size());
success = SetupDiClassGuidsFrom(&classGuid, buf, 1, &requiredSize); if(TRUE == success) { hDevInfo = SetupDiGetClassDevs(&classGuid, nullptr, nullptr, DIGCF_PRESENT); } return hDevInfo; } vector<MY_SP_DEVINFO_DATA> enumAllDevInfoData(const HDEVINFO &hDevInfo) { vector<MY_SP_DEVINFO_DATA> devInfoDataList; DWORD devIndex = 0; MY_SP_DEVINFO_DATA myDevInfoData; myDevInfoData.hDevInfo = hDevInfo; while(true) { myDevInfoData.devInfoData.cbSize = sizeof(SP_DEVINFO_DATA); if(SetupDiEnumDeviceInfo(hDevInfo, devIndex, &myDevInfoData.devInfoData) == FALSE) break; devInfoDataList.push_back(myDevInfoData); ++devIndex; } return devInfoDataList; } string getDevInstanceId(MY_SP_DEVINFO_DATA &myDevInfoData) { const int maxSize = 1024; wchar_t tempCh[maxSize] = {}; DWORD requiredSize = 0; string str; if(SetupDiGetDeviceInstanceId(myDevInfoData.hDevInfo, &myDevInfoData.devInfoData, tempCh, maxSize, &requiredSize) == TRUE) { std::unique_ptr<char[]> pTemp(new char[requiredSize]{}); for(DWORD i = 0; i < requiredSize; ++i { pTemp[i] = tempCh[i]; } str = string(pTemp.get(), requiredSize); } return str; } BOOL controlDevice(MY_SP_DEVINFO_DATA &myDevInfoData, DWORD controlCode) { return controlDevice(myDevInfoData.hDevInfo, &myDevInfoData.devInfoData, controlCode); } BOOL controlDevice(HDEVINFO hDevInfo, PSP_DEVINFO_DATA pDevInfoData, DWORD controlCode) { SP_PROPCHANGE_PARAMS propChangeParams; switch(controlCode) { case DICS_ENABLE: { //need to enalbe both on global and config-specific //enable global propChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); propChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; propChangeParams.StateChange = controlCode; propChangeParams.Scope = DICS_FLAG_GLOBAL; propChangeParams.HwProfile = 0; if(SetupDiSetClassInstallParams(hDevInfo, pDevInfoData, &propChangeParams.ClassInstallHeader, sizeof(propChangeParams))) { SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, pDevInfoData); } //config-specific propChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); propChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; propChangeParams.StateChange = controlCode; propChangeParams.Scope = DICS_FLAG_CONFIGSPECIFIC; propChangeParams.HwProfile = 0; } break; default: { //config-specific propChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER); propChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE; propChangeParams.StateChange = controlCode; propChangeParams.Scope = DICS_FLAG_CONFIGSPECIFIC; propChangeParams.HwProfile = 0; } break; } BOOL result = FALSE; if(!SetupDiSetClassInstallParams(hDevInfo, pDevInfoData, &propChangeParams.ClassInstallHeader, sizeof(propChangeParams)) || !SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, pDevInfoData)) { std::cout << "falied to invoke DIF_PROPERTYCHANGE" << endl; result = FALSE; } else { SP_DEVINSTALL_PARAMS devInstallParams; devInstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS); if(SetupDiGetDeviceInstallParams(hDevInfo, pDevInfoData, &devInstallParams) && devInstallParams.Flags & (DI_NEEDRESTART | DI_NEEDREBOOT)) { std::cout << "need reboot"; } else { std::cout << "do not need reboot"; } result = true; } return result; }
转载于:https://blog.csdn.net/qq_34236354/article/details/89205112?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_v2~rank_aggregation-1-89205112.pc_agg_rank_aggregation&utm_term=windows+%E7%A6%81%E7%94%A8%E7%A1%AC%E7%9B%98%E8%AE%BE%E5%A4%87&spm=1000.2123.3001.4430