windows的USB外接设备启用禁用的C++实现


 

#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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM