首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows SetupAPI DIF_REMOVE使用率

Windows SetupAPI DIF_REMOVE使用率
EN

Stack Overflow用户
提问于 2019-05-02 16:25:40
回答 1查看 173关注 0票数 0

我正在尝试使用windows SetupAPI完全禁用键盘。

目前,我可以使用DIF_REMOVE函数成功移除键盘,如下所示:

代码语言:javascript
复制
#include <windows.h>
#include <SetupAPI.h>
#include <iostream>
#include <string>

const std::string keyboard_device_instance_path("<my_path_here>"); // Win7

HDEVINFO DeviceInfoSet = ::SetupDiGetClassDevs(nullptr, nullptr, nullptr, DIGCF_ALLCLASSES | DIGCF_ALLCLASSES);

SP_DEVINFO_DATA DeviceInfoData;
::ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
DWORD DeviceIndex = 0;
std::vector<char> DeviceInstanceId(128, '\0');
DWORD RequiredSize = 0;

// Query all devices
while (::SetupDiEnumDeviceInfo(DeviceInfoSet, DeviceIndex++, &DeviceInfoData))
{
    // Find the Keyboard
    if (::SetupDiGetDeviceInstanceIdA(DeviceInfoSet, &DeviceInfoData, &DeviceInstanceId[0], DWORD(DeviceInstanceId.size()), &RequiredSize))
    {
        if (keyboard_device_instance_path == &DeviceInstanceId[0])
        {
            std::cout << "Breaking keyboard\n";
            if (!SetupDiCallClassInstaller(DIF_REMOVE, DeviceInfoSet, &DeviceInfoData))
            {
                std::cerr << "Failed to remove keyboard: " << ::GetLastError() << '.' << std::endl;
            }
}

禁用后,我想在满足条件时重新启用键盘。为此,我自然而然地希望“DIF_UNREMOVE”,但没有成功。

以下是尝试重新启用键盘的代码:

代码语言:javascript
复制
SP_UNREMOVEDEVICE_PARAMS UnRemoveParams;
                UnRemoveParams.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
                UnRemoveParams.ClassInstallHeader.InstallFunction = DIF_UNREMOVE;
                UnRemoveParams.Scope = DI_UNREMOVEDEVICE_CONFIGSPECIFIC;
                UnRemoveParams.HwProfile = 0;

                if (::SetupDiSetClassInstallParams(DeviceInfoSet, &DeviceInfoData, &UnRemoveParams.ClassInstallHeader, sizeof(UnRemoveParams)))
                {
                    std::cout << "Fixing keyboard\n";
                    if (!SetupDiCallClassInstaller(DIF_UNREMOVE, DeviceInfoSet, &DeviceInfoData))
                    {
                        std::cerr << "Failed to re-enable keyboard: " << ::GetLastError() << std::endl;
                    }
                }

此代码紧跟在删除代码之后在while循环中使用。我得到一个错误“没有这样的设备安装”。执行此操作的正确方法是什么?我只能使用windowsXP支持的标头

EN

回答 1

Stack Overflow用户

发布于 2019-05-09 22:21:22

我最终通过重新枚举系统硬件设备来解决这个问题,如下所示:

代码语言:javascript
复制
        DWORD pdnDevInst = 0;
        if (CM_Locate_DevNodeA(PDEVINST(&pdnDevInst), NULL, CM_LOCATE_DEVNODE_NORMAL) != CR_SUCCESS)
        {
            std::cout << "Failed to revive keyboard\n";
        }
        else if (CM_Reenumerate_DevNode(pdnDevInst, CM_REENUMERATE_NORMAL) != CR_SUCCESS)
        {
            std::cout << "Failed to revive keyboard: Renumerate dev node Error\n";
        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55948387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档