当 运行 a Windows SendInput API 时监视闪烁
Monitor flashing when running a Windows SendInput API
嗯,我当然应该去 python,因为我做了几个这种类型的函数,键盘事件和鼠标事件,但决定尝试学习 windows api。
我的目标是知道何时按下鼠标的按钮 1。
我以非常初级的方式创建了这个文件,它 returns 在 mouseData 中只有 0。
奇怪的是,每当我 运行 它时,它都会以很短的间隔闪烁我的显示器,但在关闭时间隔 1 秒。很奇怪,执行不可行。
谁能帮我理解一下,试试执行看看是不是只有这里
Code:
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;
}
我可以重现你报告的'symptoms' - 效果真的很残酷!
现在,虽然我无法提供完整的解释,但我可以提供修复!您的 tagMouse
结构中有一个未初始化的字段(time
成员,这是系统使用的时间戳)。将其设置为零(告诉系统生成自己的时间戳)可以解决问题。因此,只需将此行添加到您的其他初始化语句中:
//...
tagMouse.dwExtraInfo = 0;
tagMouse.time = 0; // Adding this line fixes it!
//...
希望对您有所帮助!
注意:我也希望得到更全面的解释;但是,对我来说,未初始化的字段闻起来像未定义的行为!我已经为 time
字段尝试了多种其他值(即不为零),但尚未找到有效的值。
讨论here on devblogs可能有帮助。这句话似乎相关:
And who knows what sort of havoc that will create if a program checks
the timestamps and notices that they are either from the future or
have traveled back in time.
嗯,我当然应该去 python,因为我做了几个这种类型的函数,键盘事件和鼠标事件,但决定尝试学习 windows api。
我的目标是知道何时按下鼠标的按钮 1。
我以非常初级的方式创建了这个文件,它 returns 在 mouseData 中只有 0。 奇怪的是,每当我 运行 它时,它都会以很短的间隔闪烁我的显示器,但在关闭时间隔 1 秒。很奇怪,执行不可行。
谁能帮我理解一下,试试执行看看是不是只有这里
Code:
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;
}
我可以重现你报告的'symptoms' - 效果真的很残酷!
现在,虽然我无法提供完整的解释,但我可以提供修复!您的 tagMouse
结构中有一个未初始化的字段(time
成员,这是系统使用的时间戳)。将其设置为零(告诉系统生成自己的时间戳)可以解决问题。因此,只需将此行添加到您的其他初始化语句中:
//...
tagMouse.dwExtraInfo = 0;
tagMouse.time = 0; // Adding this line fixes it!
//...
希望对您有所帮助!
注意:我也希望得到更全面的解释;但是,对我来说,未初始化的字段闻起来像未定义的行为!我已经为 time
字段尝试了多种其他值(即不为零),但尚未找到有效的值。
讨论here on devblogs可能有帮助。这句话似乎相关:
And who knows what sort of havoc that will create if a program checks the timestamps and notices that they are either from the future or have traveled back in time.