如何在鼠标左键按下自动点击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键时,我如何让它工作
请帮助
解决方案
使用GetAsyncKeyState
或GetKeyState
不利于这种情况。下面引用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;
}
尽管如此,这不是一个适当的解决方案,但我不知道除了GetAsyncKeyState
和GetKeyState
之外,还有其他用于在Windows上测试按键的函数。它也有一个缺点,即您不能将两次点击之间的时间设置为小于70~80毫秒,或者您可以中断它。
相关文章