扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
要通过代码来控制触摸屏的触控功能的开关,由于触摸屏触摸功能是通过HID协议来实现的,故想通过HID协议相关库来启用/禁用设备管理器中的HID触摸屏设备。
折腾过程如下
Qt 5.12.2 mingw64位 windows11
主要函数介绍代码设计思路与实现 获取HID devices class的句柄集注意:SetupDiChangeState接口中使用的句柄和设备信息必须是对应的,即下文的SP_DEVINFO_DATA 必须是由传入的句柄所得到的。具体可以点击上面的接口查看具体的传入参数。
// 获取HID设备类的GUID
GUID guid;
HidD_GetHidGuid(&guid);
// 获取HID设备类的句柄集
HID_CONTROL_HANDLE = SetupDiGetClassDevs(&guid, nullptr, nullptr, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
遍历设备接口,根据vid, pid匹配对应的设备// 循环查找目标设备
unsigned i = 0;
SP_DEVINFO_DATA devData;
devData.cbSize = sizeof (SP_DEVINFO_DATA);
while(1)
{SP_DEVICE_INTERFACE_DATA devInterface;
devInterface.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
if( !SetupDiEnumDeviceInterfaces(handle, nullptr, &guid, i, &devInterface) )
{DWORD error = GetLastError();
if(i >0 && error >0 && error != 259){// 259 代表没有更多数据
qCritical()<< "设备接口枚举失败!错误代码:"<< error;
}
break;
}
++i;
// 获取设备细节结构体缓冲区的大小,同时获取设备信息SP_DEVINFO_DATA
DWORD size;
if( !SetupDiGetDeviceInterfaceDetail(handle, &devInterface, nullptr, 0, &size, &devData) && (122 != GetLastError()))
{qCritical()<< "获取设备细节结构体缓冲区大小失败!错误代码:"<< GetLastError();
break;
}
// 获取设备细节信息(其中仅包含设备实例路径, 设备实例路径是唯一的)
auto_freedetail((SP_DEVICE_INTERFACE_DETAIL_DATA*)malloc(size));
detail.get()->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
if( !SetupDiGetDeviceInterfaceDetail(handle, &devInterface, detail.get(), size, nullptr, &devData) )
{qCritical()<< "获取设备实例路径失败!错误代码:"<< GetLastError();
break;
}
// 根据设备实例路径判断设备唯一性
tstring str = tstring(detail->DevicePath);
if(judgePath(detail->DevicePath, vid, pid)) //匹配vid, pid
{DeviceInfo info;
info.devInfoData = devData;
info.devPath = stringFromTCHAR(detail->DevicePath);
devInfos.push_back(info);
}
}
设备状态控制bool excuteStatus = false;
if(!devices.empty())
{foreach( auto device, devices){SP_PROPCHANGE_PARAMS propChange;
propChange.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
propChange.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
propChange.Scope = DICS_FLAG_GLOBAL;
propChange.StateChange = enable ? DICS_ENABLE : DICS_DISABLE;
DeviceFeature feature = device->getDeviceFeature();
if ( SetupDiSetClassInstallParams(HID_CONTROL_HANDLE, &feature.devInfoData, &propChange.ClassInstallHeader, sizeof (propChange) ) )
{if (SetupDiChangeState(HID_CONTROL_HANDLE, &feature.devInfoData))
{excuteStatus = true;
}
else {excuteStatus = false;
DWORD errror = GetLastError();
qCritical()<< "状态改变执行失败!错误代码:"<< errror;
}
}
else
{excuteStatus = false;
DWORD error = GetLastError();
qCritical()<< "设置安装参数失败!错误代码:"<< error;
}
}
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流