运行Windows SenInput API时显示器闪烁

问题描述 投票:0回答:1

嗯,我当然应该使用python,因为我做了几种此类功能,包括键盘事件和鼠标事件,但是决定尝试学习Windows api。

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

我以一种非常初学者的方式创建了此文件,它在mouseData中仅返回0。奇怪的是,每当我运行它时,它就会以短暂的时间间隔闪烁一次,但在1秒钟的关闭状态下会闪烁我的监视器。很奇怪,执行不可行。

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

Código

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;
}
c visual-studio-2015 mouseevent
1个回答
0
投票

可以重现您报告的“症状”-结果确实很残酷!

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

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

希望这会有所帮助!

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

关于here on devblogs的讨论可能帮助。

© www.soinside.com 2019 - 2024. All rights reserved.