Как сделать аппаратный виртуальный ввод?

Я хотел сделать стрейф-бота для гарри мода, и у меня получилось вот что:

#define WIN32_LEAN_AND_MEAN
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include "stdafx.h"

class KeyBot
{
private:
    INPUT _buffer[1];

public:
    KeyBot();
    void KeyUp(char key);
    void KeyDown(char key);
    void KeyClick(char key);
};

KeyBot::KeyBot()
{
    _buffer->type = INPUT_KEYBOARD;
    _buffer->ki.wScan = 0;
    _buffer->ki.time = 0;
    _buffer->ki.dwExtraInfo = 0;
}

void KeyBot::KeyUp(char key)
{
    _buffer->ki.wVk = key;
    _buffer->ki.dwFlags = KEYEVENTF_KEYUP;
    SendInput(1, _buffer, sizeof(INPUT));
}

void KeyBot::KeyDown(char key)
{
    _buffer->ki.wVk = key;
    _buffer->ki.dwFlags = 0;
    SendInput(1, _buffer, sizeof(INPUT));
}

void KeyBot::KeyClick(char key)
{
    KeyDown(key);
    Sleep(10);
    KeyUp(key);
}

char check_mouse(POINT xOne, POINT xTwo)
{
    GetCursorPos(&xOne);
    Sleep(1);
    GetCursorPos(&xTwo);
    if ((xTwo.x - xOne.x) > 0) {
        return 'D';
    }
    else {
        if ((xTwo.x - xOne.x) < 0) {
            return 'A';
        }
        else {
            if ((xTwo.x - xOne.x) == 0) {
                return 'N';
            }
        }
    }
}

int main()
{
    KeyBot bot;
    POINT xOne;
    POINT xTwo;

    while (1) {
        if (check_mouse(xOne, xTwo) == 'A') {
            bot.KeyUp(0x44);
            bot.KeyDown(0x41);
        }
        if (check_mouse(xOne, xTwo) == 'D') {
            bot.KeyUp(0x41);
            bot.KeyDown(0x44);
        }
        if (check_mouse(xOne, xTwo) == 'N') {
            bot.KeyUp(0x44);
            bot.KeyUp(0x41);
        }
    }
    return 0;
}

Это отлично работает, когда я открываю блокнот или игровой чат, он удерживает a, когда я перемещаю мышь влево, и удерживает d, когда я перемещаю мышь вправо. Проблема в том, что когда я нахожусь в игре, мой персонаж вообще не двигается. Я думаю, проблема в том, что это виртуальное нажатие клавиши, а не аппаратное, и я не знаю, как это изменить. может ли кто-нибудь изменить мой код, чтобы это работало?


person Lucas Knook    schedule 19.09.2018    source источник
comment
Это действительно зависит от того, как игра получает ввод. Довольно мало игр используют какой-то низкоуровневый механизм (например, аппаратный, если использовать ваши слова) для захвата ввода, улучшения отклика или некоторых других характеристик. Например, если игра устанавливает выделенный драйвер режима ядра, средства взаимодействия с этим драйвером будут такими, какими их выбрал разработчик игры — это всего лишь одна из тактик, усложняющая людям жульничество в игре. Никто не сможет вам помочь, не зная, как ваша конкретная игра захватывает нажатия клавиш.   -  person Peter    schedule 19.09.2018
comment
Пожалуйста, отредактируйте сообщение, чтобы определить INPUT.   -  person Thomas Matthews    schedule 19.09.2018
comment
Почему у вас есть массив из 1 элемента?   -  person Thomas Matthews    schedule 19.09.2018
comment
Вы должны вызвать check_mouse() один раз перед операторами if. Существует вероятность того, что каждый вызов может вернуть другое значение.   -  person Thomas Matthews    schedule 19.09.2018
comment
Вы можете предпочесть использовать оператор switch в while вместо if. Или замените ifs на std::map, поскольку вы связываете букву со значениями клавиши вверх и вниз.   -  person Thomas Matthews    schedule 19.09.2018
comment
@ThomasMatthews INPUT должен быть этим   -  person Karsten Koop    schedule 19.09.2018
comment
См. также этот вопрос   -  person Karsten Koop    schedule 19.09.2018