使用 SendInput 或 mouse_event 不适用于 clock()?

Using SendInput or mouse_event doesn't work with clock()?

本文关键字:clock 适用于 不适用 event SendInput mouse 使用      更新时间:2023-10-16
void leftClick(){
INPUT input[2];
input[0].type = INPUT_MOUSE;
input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
input[1].type = INPUT_MOUSE;
input[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;
SendInput(2, input, sizeof(INPUT));
cout<<"click downn";
cout<<"click upnn";
/*
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
*/
}
ReadProcessMemory(process, (void*)address, &value, sizeof(value), 0);
if (value == 1){
if (clock() - click_time >= 500){
cout<<"click time = "<< click_time <<endl;
cout<<clock() - click_time <<endl;
leftClick();
click_time = clock();
}
}

这给出的输出

click time = 0
57209
click down
click up
click time = 57222
501
click down
click up
click time = 57738
500
click down
click up

正如你所看到的,点击应该发生,但这不会发送任何点击。只有当我把所有的时钟东西都拿出来的时候,它才会发出咔嗒声。如果我使用mouse_event而不是SendInput,也会发生同样的情况。

edit:我在上面更改了SendInput,没有更改任何行为。评论的mouse_events也给出了相同的行为

编辑:我似乎做不出一个最小的可复制的例子。如果没有ReadProcessMemory,它可以在延迟的情况下正常工作,只是在读取进程时不会延迟发送点击。正在研究将ReadProcessMemory与任何类型的延迟输入相结合的问题。

目标进程/窗口可以检测SendInput并使用LLMHF_INJECTED标志阻止它。

如果它没有阻塞输入,您应该使用MOUSEEVENTF_LEFTDOWN发送input((一次,然后在延迟之后,您应该用MOUSEEVENTF_LEFTUP再次调用它。您不知道目标进程是如何处理输入的,添加延迟在某些情况下对我很有帮助。

这里有一个例子,使用std::chrono作为1个延迟定时器,我使用了DOWN&UP,努力使解决方案不比简单示例所需的更复杂。

#include <chrono>
#include <thread>
int main()
{
INPUT input{ 0 };
input.type = INPUT_MOUSE;
bool bClick = false;
using Clock = std::chrono::steady_clock;
std::chrono::time_point<std::chrono::steady_clock> start, now;
std::chrono::milliseconds duration;
start = Clock::now();
while (true)
{
//toggles it on and off with one key
if (GetAsyncKeyState('U') & 1)
bClick = !bClick;
if (bClick)
{
now = Clock::now();
duration = std::chrono::duration_cast<std::chrono::milliseconds>(now - start);
if (duration.count() >= 100)
{
input.mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
SendInput(1, &input, sizeof(INPUT));
std::this_thread::sleep_for(std::chrono::milliseconds(30));
input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
SendInput(1, &input, sizeof(INPUT));
start = std::chrono::steady_clock::now();
}
}
}
return 0;
}

您可以使用U键打开和关闭它。