如何在鼠标左键按下自动点击c++时触发循环

2022-08-11 00:00:00 mouse c++

嘿,我正在尝试仅在按住鼠标左键时才单击自动点击工具。

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


     }

 }

(我在手机上打了这个,对不起,??) 基本上,循环会自动取消它,因为它会发送Leftup。

我知道我可以将它绑定到另一个键上,但当我按住Leftdown键时,我如何让它工作

请帮助


解决方案

使用GetAsyncKeyStateGetKeyState不利于这种情况。下面引用MSDN中的一句话,指出您尝试执行的操作不适合将这两个函数与SendInput结合使用。

此函数不重置键盘的当前状态。调用函数时已经按下的任何键都可能会干扰此函数生成的事件。

非常重要:您的目标应该是区分程序没有模拟的输入和模拟的输入。 这并不意味着您应该使这段代码复杂化,并使用钩子验证输入是否合法(有关此方法的更多信息,请参阅here答案)。您只想看看输入是否在您的循环中生成。

我想出了这个类似的解决方案,遗憾的是它仍然使用这两个函数,因为我不知道其他函数将测试输入。它不是完美的,但这是我用简单代码能得到的最接近的结果。

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

在您的Main中,您可以拥有以下内容:

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

    return 0;
}

尽管如此,这不是一个适当的解决方案,但我不知道除了GetAsyncKeyStateGetKeyState之外,还有其他用于在Windows上测试按键的函数。它也有一个缺点,即您不能将两次点击之间的时间设置为小于70~80毫秒,或者您可以中断它。

相关文章