要通過代碼來控制觸摸屏的觸控功能的開關(guān),由于觸摸屏觸摸功能是通過HID協(xié)議來實(shí)現(xiàn)的,故想通過HID協(xié)議相關(guān)庫來啟用/禁用設(shè)備管理器中的HID觸摸屏設(shè)備。
折騰過程如下
Qt 5.12.2 mingw64位 windows11
主要函數(shù)介紹代碼設(shè)計(jì)思路與實(shí)現(xiàn) 獲取HID devices class的句柄集注意:SetupDiChangeState接口中使用的句柄和設(shè)備信息必須是對應(yīng)的,即下文的SP_DEVINFO_DATA 必須是由傳入的句柄所得到的。具體可以點(diǎn)擊上面的接口查看具體的傳入?yún)?shù)。
// 獲取HID設(shè)備類的GUID
GUID guid;
HidD_GetHidGuid(&guid);
// 獲取HID設(shè)備類的句柄集
HID_CONTROL_HANDLE = SetupDiGetClassDevs(&guid, nullptr, nullptr, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
遍歷設(shè)備接口,根據(jù)vid, pid匹配對應(yīng)的設(shè)備// 循環(huán)查找目標(biāo)設(shè)備
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 代表沒有更多數(shù)據(jù)
qCritical()<< "設(shè)備接口枚舉失敗!錯(cuò)誤代碼:"<< error;
}
break;
}
++i;
// 獲取設(shè)備細(xì)節(jié)結(jié)構(gòu)體緩沖區(qū)的大小,同時(shí)獲取設(shè)備信息SP_DEVINFO_DATA
DWORD size;
if( !SetupDiGetDeviceInterfaceDetail(handle, &devInterface, nullptr, 0, &size, &devData) && (122 != GetLastError()))
{qCritical()<< "獲取設(shè)備細(xì)節(jié)結(jié)構(gòu)體緩沖區(qū)大小失敗!錯(cuò)誤代碼:"<< GetLastError();
break;
}
// 獲取設(shè)備細(xì)節(jié)信息(其中僅包含設(shè)備實(shí)例路徑, 設(shè)備實(shí)例路徑是唯一的)
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()<< "獲取設(shè)備實(shí)例路徑失敗!錯(cuò)誤代碼:"<< GetLastError();
break;
}
// 根據(jù)設(shè)備實(shí)例路徑判斷設(shè)備唯一性
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);
}
}
設(shè)備狀態(tài)控制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()<< "狀態(tài)改變執(zhí)行失敗!錯(cuò)誤代碼:"<< errror;
}
}
else
{excuteStatus = false;
DWORD error = GetLastError();
qCritical()<< "設(shè)置安裝參數(shù)失敗!錯(cuò)誤代碼:"<< error;
}
}
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)頁名稱:windowsc++禁用/啟動(dòng)HID設(shè)備(鼠標(biāo)、鍵盤、觸摸屏等)-創(chuàng)新互聯(lián)
標(biāo)題鏈接:http://vcdvsql.cn/article36/jiisg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、網(wǎng)站建設(shè)、網(wǎng)站制作、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容