通过设备描述符获得设备信息,并禁用/启用。
(64位、32位都可以使用)
bool fun(QString pDevice, int pState){
qDebug() << "设备描述:" << pDevice;
//获取设备信息集句柄
HDEVINFO hDevInfo = SetupDiGetClassDevs(NULL, 0, 0, DIGCF_ALLCLASSES | DIGCF_PRESENT);
if(hDevInfo == INVALID_HANDLE_VALUE){
qDebug() << "GetClassDevs Fail";
return false;
}
SP_DEVINFO_DATA DeviceInfoData;
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
//从设备序号0开始逐一扫描
bool ok = false;
DWORD i;
for(i=0; SetupDiEnumDeviceInfo(hDevInfo, i, &DeviceInfoData); i++){
WCHAR szDescBuf[MAX_PATH] = {0};
DWORD Type;
DWORD buffersize = MAX_PATH - 1;
if(!SetupDiGetDeviceRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC, &Type, (PBYTE)szDescBuf, buffersize, &buffersize)){
continue;
}
//获得的信息
QString temp = QString::fromStdWString(szDescBuf);
if(temp.contains(pDevice)){
//找到设备
qDebug() << "======Find======";
//禁用/启用
SP_PROPCHANGE_PARAMS spPropChangeParams;
spPropChangeParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
spPropChangeParams.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
spPropChangeParams.Scope = DICS_FLAG_GLOBAL;
if(pState == 1){
//启用
spPropChangeParams.StateChange = DICS_ENABLE;
} else{
//禁用
spPropChangeParams.StateChange = DICS_DISABLE;
}
if(!SetupDiSetClassInstallParams(hDevInfo, &DeviceInfoData, (SP_CLASSINSTALL_HEADER*)&spPropChangeParams, sizeof(spPropChangeParams)))
{
DWORD errorcode = GetLastError();
qDebug() << "SetupDiSetClassInstallParams:" << errorcode;
break;
}
if(!SetupDiChangeState(hDevInfo, &DeviceInfoData)){
qDebug() << "SetupDiChangeState:" << GetLastError();
break;
}
qDebug() << "======Success======";
ok = true;
break;
}
}
//关闭设备信息集句柄
SetupDiDestroyDeviceInfoList(hDevInfo);
return ok;
}