使用鼠标左键变量单击并按住来重复执行do语句

时间:2019-01-19 09:30:59

标签: c++ winapi

嘿,目前正在测试一些游戏的自动点击器,我对C ++还是陌生的

如何在不停止do语句的情况下使用鼠标左键为鼠标单击功能运行do语句

我尝试了不同的标志,包括:

input.mi.dwFlags = (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP);

带有mouse_event(MOUSEEVENTF)

do {
    if (GetAsyncKeyState(VK_LBUTTON) & 0x80000000) {
        enabled = true;

        while (GetAsyncKeyState(VK_LBUTTON) & 0x80000000) {
            Sleep(1000 / cps);
            INPUT input;
            input.type = INPUT_MOUSE;
            input.mi.dx = 0;
            input.mi.dy = 0;
            input.mi.dwFlags = (MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE | MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP);
            input.mi.mouseData = 0;
            input.mi.dwExtraInfo = NULL;
            input.mi.time = 0;
            SendInput(1, &input, sizeof(INPUT));

        }
    }


} while (true);

我正在尝试这样做,因此当您按住左键单击时,它将运行包含自动单击功能的while语句,而不会由于重复单击而停止while语句。

1 个答案:

答案 0 :(得分:0)

您应该在代码中注意一些事项:

首先,如何判断GetAsyncKeyState()的返回值

  

如果函数成功,则返回值指定键是否   自上次调用GetAsyncKeyState以来,按下了该键,以及是否   按键当前是向上还是向下。如果设置了最高有效位,则   键已按下,如果设置了最低有效位,则该键为   在上一次调用GetAsyncKeyState之后按下。但是你   不应该依赖这种最后的行为;有关更多信息,请参见   备注。

返回值的类型为SHORT,即2个字节。因此,请尝试使用GetAsyncKeyState(VK_LBUTTON) & 0x8000

第二,如何使用SendInput()发送不同的鼠标状态。 您应该创建一个新的INPUT数据来保存不同的操作,而不仅仅是合并所有这些操作。

代码示例:

do {
        if (GetAsyncKeyState(VK_LBUTTON) & 0x8000)
        {
            enabled = true;
            while (GetAsyncKeyState(VK_LBUTTON) & 0x8000) 
            {
                INPUT input[2];
                input[0].type = input[1].type = INPUT_MOUSE;
                input[0].mi.dx = 0;
                input[0].mi.dy = 0;
                input[0].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTDOWN;
                input[1].mi.dx = 0;
                input[1].mi.dy = 0;
                input[1].mi.dwFlags = MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_LEFTUP;
                SendInput(2, input, sizeof(INPUT) * 2);
            }
        }


    } while (true);