真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

windowsc++禁用/啟動(dòng)HID設(shè)備(鼠標(biāo)、鍵盤、觸摸屏等)-創(chuàng)新互聯(lián)

windows c++禁用/啟動(dòng)HID設(shè)備
  • 背景
  • 環(huán)境
  • 主要函數(shù)介紹
  • 代碼設(shè)計(jì)思路與實(shí)現(xiàn)
    • 獲取HID devices class的句柄集
    • 遍歷設(shè)備接口,根據(jù)vid, pid匹配對(duì)應(yīng)的設(shè)備
    • 設(shè)備狀態(tài)控制

創(chuàng)新互聯(lián)建站專注于遷安企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城建設(shè)。遷安網(wǎng)站建設(shè)公司,為遷安等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)背景

要通過代碼來控制觸摸屏的觸控功能的開關(guān),由于觸摸屏觸摸功能是通過HID協(xié)議來實(shí)現(xiàn)的,故想通過HID協(xié)議相關(guān)庫來啟用/禁用設(shè)備管理器中的HID觸摸屏設(shè)備。

折騰過程如下

  • 試圖通過hidapi來實(shí)現(xiàn),發(fā)現(xiàn)hidapi中只能讀取或發(fā)送數(shù)據(jù)
  • 查找HID相關(guān)的庫,找到一個(gè)libhid的庫,但發(fā)現(xiàn)其也沒有啟用/禁用接口
  • 嘗試使用windows api來控制,也就有了下面的內(nèi)容
環(huán)境

Qt 5.12.2 mingw64位 windows11

主要函數(shù)介紹
  • SetupDiGetClassDevs 返回對(duì)應(yīng)的一類設(shè)備信息集句柄
  • SetupDiEnumDeviceInterfaces 遍歷枚舉設(shè)備接口
  • SetupDiGetDeviceInterfaceDetail 獲取設(shè)備接口的實(shí)例路徑,解析出HID,VID,匹配我們要找的設(shè)備;獲取設(shè)備的詳細(xì)信息
  • SetupDiSetClassInstallParams 設(shè)置設(shè)備安裝類參數(shù)
  • SetupDiChangeState 改變?cè)O(shè)備狀態(tài)(啟用/禁用)

注意:SetupDiChangeState接口中使用的句柄和設(shè)備信息必須是對(duì)應(yīng)的,即下文的SP_DEVINFO_DATA 必須是由傳入的句柄所得到的。具體可以點(diǎn)擊上面的接口查看具體的傳入?yún)?shù)。

代碼設(shè)計(jì)思路與實(shí)現(xiàn) 獲取HID devices class的句柄集
// 獲取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匹配對(duì)應(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級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧


分享標(biāo)題:windowsc++禁用/啟動(dòng)HID設(shè)備(鼠標(biāo)、鍵盤、觸摸屏等)-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://weahome.cn/article/jiisg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部