Как вызвать l oop, когда левой кнопкой мыши нажата автокликер c ++ - PullRequest
2 голосов
/ 07 марта 2020

Эй, я пытаюсь заставить мой автокликер щелкать только, когда я удерживаю левую кнопку мыши нажатой.

void clikr()
{
  INPUT Input ={0};
  int sleepzZz = 1000 / times;
  active = false;
  system(“cls”);
  while(1)
{
    if((GetAsyncKeyState(VK_LBUTTON) & 0x8000) != 0)
    {
      Sleep(sleepzZz);
      Input.type = INPUT_MOUSE
      Input.mi.dwFlags =  MOUSEEVENTF_LEFTDOWN;
      ::SendInput(1, &Input, sizeof(INPUT))

      ::ZeroMemory(&Input, sizeof(INPUT));
      Input.type = INPUT_MOUSE;
      Input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
      ::SendInput(1, &Input, sizeof(INPUT));


     }

 }

(я набрал это на своем телефоне, мне очень жаль ?) По сути, l oop отменяет сам, потому что отправляет leftup.

Я понимаю, что могу связать его с другой клавишей, но как бы я go заставил это работать, когда я удерживал левую клавишу

Пожалуйста, помогите

1 Ответ

1 голос
/ 07 марта 2020

Использование GetAsyncKeyState или GetKeyState плохо для этого случая. Вот цитата из MSDN о том, что именно то, что вы пытаетесь сделать, не подходит для выполнения с двумя функциями в сочетании с SendInput.

Эта функция не сбрасывает текущее состояние клавиатуры. Любые клавиши, которые уже были нажаты при вызове функции, могут мешать событиям, которые генерирует эта функция.

ОЧЕНЬ ВАЖНО : Вы должны стремиться к тому, чтобы различать guish между входами, которые не моделируются вашей программой, и входами, которые имитируются. Это не означает, что вы должны усложнить этот код и проверить правильность ввода с помощью хуков (подробнее об этом подходе в ответах здесь ). Вы просто хотите увидеть, сгенерирован ли ввод в вашем l oop или нет в вашем l oop.

Я придумал это простое решение, которое, к сожалению, все еще использует две функции, потому что я не знаю других, которые будут проверять входные данные. Он не идеален , но он ближе всего к простому коду, который я мог бы получить.

VOID WINAPI ClickLoop()
{
    /** wait for any LMB press. */
    while ((GetAsyncKeyState(VK_LBUTTON)&0x8000) == 0)
        Sleep(1);

    INT nCurrKeyState = GetKeyState(VK_LBUTTON);
    INT nPrevKeyState;

    do
    {
        INPUT Input;
        ZeroMemory(&Input, sizeof(INPUT));
        Input.type = INPUT_MOUSE;


        Input.mi.dwFlags =  MOUSEEVENTF_LEFTUP;
        SendInput(1, &Input, sizeof(INPUT));

        Sleep(0); // how many miliseconds between the clicks.
        Input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
        SendInput(1, &Input, sizeof(INPUT));


        // !! Do not set this number too low
        // !! Setting it too low might cause infinite loops
        //     and you cannot stop your clicks at first try.
        Sleep(70); // how many miliseconds the click is held.

        nPrevKeyState = nCurrKeyState;
        nCurrKeyState = GetKeyState(VK_LBUTTON);

        if ((GetAsyncKeyState(VK_LBUTTON)&0x8000) == 0)
            break;
    }while (nCurrKeyState != nPrevKeyState);
}

И в вашем основном у вас может быть что-то вроде:

int main()
{
    while(TRUE)
    {
        printf("In click loop...\n");
        ClickLoop();
    }

    return 0;
}

Все еще , это неправильное решение , но я не знаю никаких других функций для тестирования клавиш на windows кроме GetAsyncKeyState и GetKeyState. Недостатком также является то, что вы не можете установить время между щелчками менее 70 ~ 80 мс или вы можете его сломать.

...