如何在鼠标左键按下时触发循环 autoclicker c++

Posted

技术标签:

【中文标题】如何在鼠标左键按下时触发循环 autoclicker c++【英文标题】:How to trigger loop when left mouse down autoclicker c++ 【发布时间】:2020-03-07 08:48:31 【问题描述】:

嘿,我试图让我的自动点击器只在我按住鼠标左键时点击。

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 时我将如何让它工作

请帮忙

【问题讨论】:

【参考方案1】:

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

在你的主要内容中,你可以有类似的东西:

int main()

    while(TRUE)
    
        printf("In click loop...\n");
        ClickLoop();
    

    return 0;

不过,这不是一个合适的解决方案,但除了GetAsyncKeyStateGetKeyState 之外,我不知道任何其他用于测试Windows 上的键的功能。它还有一个缺点,您不能将点击之间的时间设置为小于 70~80 毫秒,或者您可以打破它。

【讨论】:

以上是关于如何在鼠标左键按下时触发循环 autoclicker c++的主要内容,如果未能解决你的问题,请参考以下文章

如何在OpenGL中实现按住鼠标左键就可以旋转图形的功能

检测鼠标左键按下

求高手解决:js如何判断鼠标左键是不是按下?

Chrome浏览器下JQuery实现鼠标左键按下移动,鼠标左键抬起停止移动功能的问题

MFC的OnMouseMove移动位置和OnMouseWheel缩放实现

Opencv稍微高级点的鼠标事件-OpenCV步步精深