Windows SetupAPI DIF_REMOVE использование - PullRequest
0 голосов
/ 02 мая 2019

Я пытаюсь полностью отключить клавиатуру с помощью Windows SetupAPI.

В настоящее время я могу успешно удалить клавиатуру без проблем, используя функцию DIF_REMOVE, например:

#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», но безуспешно.

Вот код, который пытается повторно включить клавиатуру:

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;
                    }
                }

Этот код используется в то время какЦикл сразу после удаления кода.Я получаю сообщение об ошибке «Такое устройство не установлено».Как правильно это сделать?Я могу использовать только заголовки, поддерживаемые windowsXP

1 Ответ

0 голосов
/ 09 мая 2019

В конце концов, я решил эту проблему, пересчитав системные устройства, например, так:

        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";
        }
...