以下为引用:
HDEVINFO m_hDevInfo = ::SetupDiGetClassDevs(NULL, NULL, NULL, DIGCF_ALLCLASSES | DIGCF_PRESENT);
以下为引用:
SP_DEVINFO_DATA did = { sizeof(SP_DEVINFO_DATA) };
for(int i=0; ::SetupDiEnumDeviceInfo(m_hDevInfo, i, &did); i++)
{
//...
}
在找到要处理的设备后,应该用CM_Get_DevNode_Status函数和注册表获取其状态,忽略被隐藏的设备。
以下为引用:
bool CDeviceManager::IsClassHidden(const GUID *ClsGuid) const
{
HKEY hKeyClass = ::SetupDiOpenClassRegKey(ClsGuid, KEY_READ);
bool hidden = false;
if(INVALID_HANDLE_VALUE != hKeyClass)
{
hidden = ERROR_SUCCESS == ::RegQueryValueEx(hKeyClass, REGSTR_VAL_NODISPLAYCLASS, NULL, NULL, NULL, NULL);
::RegCloseKey(hKeyClass);
}
return hidden;
}
DWORD dwStatus = 0, dwProblem = 0;
if(CR_SUCCESS != ::CM_Get_DevNode_Status(&dwStatus, &dwProblem, did.DevInst,0))
{
DisplayError("CM_Get_DevNode_Status");
continue;
}if(dwStatus & DN_NO_SHOW_IN_DM || IsClassHidden(&did.ClassGuid))
{
continue;
}
以下为引用:
const std::string CDeviceManager::GetProperty(SP_DEVINFO_DATA& did, DWORD Property) const
{
std::string buf;
DWORD dwLength = 0;while(!::SetupDiGetDeviceRegistryProperty(m_hDevInfo, &did, Property, NULL,
(PBYTE)buf.c_str(), buf.size(), &dwLength))
{
if(::GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
buf.resize(dwLength * sizeof(wchar_t));
std::fill(buf.begin(), buf.end(), '\0');
}
else
{
break;
}
}
buf.resize(strlen(buf.c_str()));return buf;
}if(stricmp(GetProperty(did, SPDRP_CLASSGUID).c_str(), "{4d36e972-e325-11ce-bfc1-08002be10318}") == 0)
{
// ...
}
以下为引用:
bool CDeviceManager::ChangeDeviceState(SP_DEVINFO_DATA& did, DWORD State) const
{
SP_PROPCHANGE_PARAMS pcp = {sizeof(SP_CLASSINSTALL_HEADER)};
pcp.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
pcp.Scope = (State == DICS_START || State == DICS_STOP )? DICS_FLAG_CONFIGSPECIFIC : DICS_FLAG_GLOBAL;
pcp.StateChange = State;
if(!::SetupDiSetClassInstallParams(m_hDevInfo, &did,
(SP_CLASSINSTALL_HEADER *)&pcp, sizeof(pcp)))
{
DisplayError("SetupDiSetClassInstallParams");
return false;
}
//
// Call the ClassInstaller and perform the change.
//
if(!::SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, m_hDevInfo, &did))
{
DisplayError("SetupDiCallClassInstaller");
}
return true;
}ChangeDeviceState(did, DICS_STOP); // 停止
ChangeDeviceState(did, DICS_START); // 启动
ChangeDeviceState(did, DICS_ENABLE); // 启用
ChangeDeviceState(did, DICS_DISABLE); // 禁用
最新相关文章
发表评论