首页 > 解决方案 > 运行 Windows SendInput API 时显示器闪烁

问题描述

好吧,我当然应该去python,因为我做了几个这种类型的功能,键盘事件和鼠标事件,但决定尝试学习windows api。

我的目标是知道何时按下鼠标的按钮 1。

我以非常初学者的方式创建了这个文件,它在 mouseData 中仅返回 0。奇怪的是,每当我运行它时,它都会以短间隔闪烁我的显示器,但在 1 秒之间闪烁。很奇怪,执行不可行。

有人可以帮助我理解并尝试执行以查看它是否仅在此处。

代码:

int main()
{
    DWORD mouseData = 0;

    MOUSEINPUT tagMouse;
    tagMouse.dx = 0;
    tagMouse.dy = 0;
    tagMouse.mouseData = mouseData;
    tagMouse.dwFlags = MOUSEEVENTF_XDOWN;
    tagMouse.dwExtraInfo = 0;

    INPUT tagInput;
    tagInput.type = INPUT_MOUSE;
    tagInput.mi = tagMouse;

    while (true) {
        if (GetAsyncKeyState(VK_DELETE)) break;
        SendInput(1, &tagInput, sizeof(INPUT));
        printf("KEYWORD: %d\n", mouseData);
        Sleep(500);
    }
    system("pause");
    return 0;
}

标签: cvisual-studio-2015mouseevent

解决方案


可以重现你报告的“症状”——效果真的很残酷!

现在,虽然我无法提供完整的解释,但我可以提供修复!您的tagMouse结构中有一个未初始化的字段(time成员,它是系统使用的时间戳)。将此设置为零(告诉系统生成自己的时间戳)可以解决问题。因此,只需将此行添加到您的其他初始化语句中:

//...
    tagMouse.dwExtraInfo = 0;
    tagMouse.time = 0; // Adding this line fixes it!
//...

希望这可以帮助!

注意:我也希望得到更全面的解释;但是,对我来说,未初始化的字段闻起来像是未定义的行为!我已经为该字段尝试了各种其他值(即不为零),time但还没有找到一个有效的值。

devblogs 上 的讨论可能会有所帮助。这句话似乎很相关:

谁知道如果程序检查时间戳并注意到它们来自未来或已经回到过去,会造成什么样的破坏。


推荐阅读