SendInput MOUSEEVENT_MOVE导致屏幕闪烁

时间:2020-03-26 19:23:32

标签: c++ winapi

所以我试图用c ++编写一个程序,该程序可以移动鼠标光标,就像用户移动鼠标一样。 我有一段代码,看起来像这样:

std::atomic<bool> exit_condition = false;

std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> ud(-20, 20);
void move_mouse() {
    while (!exit_condition) {
        INPUT input;
        input.type = INPUT_MOUSE;
        input.mi.mouseData = 0;
        input.mi.dwFlags = MOUSEEVENTF_MOVE;
        input.mi.dx = ud(gen);
        input.mi.dy = ud(gen);
        SendInput(1, &input, sizeof(input));
        std::this_thread::sleep_for(100ms);
    }
}

问题是,当程序到达此循环时,屏幕开始闪烁。

我有第二个显示器通过HDMI电缆连接到我的笔记本电脑,并且笔记本电脑的显示器每隔几个周期(我相信)打开/关闭一次,它就完全关闭了。

鼠标移动。因此该程序可以完成我想要的操作,

有人知道那里发生了什么吗?您能帮我了解潜在的问题吗?

还有一件事情,下面的代码具有相同的效果:

void move_mouse() {
    INPUT input;
    input.type = INPUT_MOUSE;
    input.mi.mouseData = 0;
    input.mi.dwFlags = MOUSEEVENTF_MOVE;
    while (!exit_condition) {
        input.mi.dx = ud(gen);
        input.mi.dy = ud(gen);
        SendInput(1, &input, sizeof(input));
        std::this_thread::sleep_for(100ms);
    }
}

我在Windows 10计算机上使用MS Visual Studio 2019构建我的“解决方案”。从x32切换到x64构建配置不起作用。 _MSC_VER是784。_MSC_FULL_VER是b78391c。我不知道这是否相关。

//编辑: 我使用mouse_event修复了闪烁: mouse_event(MOUSEEVENTF_MOVE, ud(gen), ud(gen), 0, NULL);

但是问题仍然存在:为什么? 当我添加input.mi.dwExtraInfo = NULL;并使用SendInput时,仍然会发生闪烁。 我还想念什么?

1 个答案:

答案 0 :(得分:2)

正如乔纳森·波特(Jonathan Potter)所说的那样,Windows使用输入队列中事件的时间戳来决定何时该打开或关闭屏幕保护程序或低功耗模式。

因此问题出在时间戳上。解决方案是使用系统自己的时间戳。

事件的时间戳,以毫秒为单位。如果此参数为0, 系统将提供自己的时间戳。

您可以使用memset初始化SendInput

memset(&input, 0, sizeof(input));

添加input.mi.time = 0;