【问题标题】:How to trigger loop when left mouse down autoclicker c++如何在鼠标左键按下时触发循环 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 时我将如何让它工作

请帮忙

【问题讨论】:

    标签: c++ mouse


    【解决方案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 毫秒,或者您可以打破它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-05
      • 2010-09-27
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 2011-02-28
      • 2010-10-18
      • 1970-01-01
      相关资源
      最近更新 更多