Как лучше написать антиотдачу для игры

Всем привет,я в с++ не силен и по этому у меня куча проблем,буду очень благодарен за помощь.Вопрос большой... Я пишу антиотдачу для игры,то есть если мы зажимает ЛКМ,у нас в игре отдача,и надо чтоб программа гасила эту отдачу,то есть совершала событие перемещение мыши. Изначальный вариант:

#include <Windows.h>
#include <iostream>
#include <winuser.h>
#include <thread>
#include <atomic>
#include <string>
#include <WinGDI.h>

using namespace std;

const string key = "1";
atomic<bool> should_stop = false;
atomic<bool> should_onoff = true;

void ak47();

void switcher()
{
    while (true)
    {
        if (GetAsyncKeyState(0x4D) && should_onoff == false)
        {
            should_onoff = true;
            Sleep(1000);
            continue;
        }

        if (GetAsyncKeyState(0x4D) && should_onoff == true)
        {
            should_onoff = false;
            Sleep(1000);
            continue;
        }
        Sleep(10);
    }
}

int main()
{
    setlocale(LC_ALL, "Russian");

    thread swt(switcher);
    swt.detach();
    byte n = 1;

    while (true)
    {
        if (GetAsyncKeyState(0x01) & GetAsyncKeyState(0x02) & 0x8000 && should_onoff)
        {
            if (n == 1)
            {
                should_stop = false;
                thread thr(ak47);
                thr.detach();
                n = 0;
            }
        }
        else
        {
            should_stop = true;
            n = 1;
        }
    }
}

И сама функция антиотдачи:

void ak47()
{
    Sleep(11);
    mouse_event((0x0001), -3, 4, 0, 0);
    if (should_stop)
        return;
    Sleep(11);
    mouse_event((0x0001), -3, 4, 0, 0);
    if (should_stop)
        return;
    Sleep(11);
    mouse_event((0x0001), -3, 4, 0, 0);
    if (should_stop)
        return;
    Sleep(11);
}

Тут много проблем:

  1. Но тут большая проблема с оптимизацией,т к главный цикл который отлавливает нажатие работает бесконечно быстро и нагружает процессор.Да и способ которым я отлавливаю нажатие мыши не хороший.Задержки делать нельзя ибо макрос должен начинаться моментально с нажатием ЛКМ.Так вот я смотрел в сторону WinApi где есть обработчик событий,но там чтобы событие бралось глобально надо ставить хук,с хуком у меня ничего не вышло(... А текущий вариант не очень красивый.

    2.Организовать выход из потока,сейчас у меня стоит флаг should_stop, который если равен 1,то поток завершается.Нужно это для того чтобы если мы отжали ЛКМ антиотдача не работала до конца.Но условие занимает какое то время,а антиотдача переписана с устройства,где нету этой проверки и там не было такого условия.Соответственно задержки между mouse_move немного другие.И надо в лучшем случае чтобы в функции были только фунции Sleep() и mouse_move.Я думал что можно как нибудь функцию антиотдачи запускать в отдельном потоке и когда клавиша переставала быть в зажатом состоянии поток останавливался или убивался.Но не нашел способа "убить" поток

Так вот можно мне как нибудь улучшить программу и избавиться от этих проблем?Буду очень благодарен за помощь.


Ответы (0 шт):