c - 运行 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;
}
解决方案
我可以重现你报告的“症状”——效果真的很残酷!
现在,虽然我无法提供完整的解释,但我可以提供修复!您的tagMouse
结构中有一个未初始化的字段(time
成员,它是系统使用的时间戳)。将此设置为零(告诉系统生成自己的时间戳)可以解决问题。因此,只需将此行添加到您的其他初始化语句中:
//...
tagMouse.dwExtraInfo = 0;
tagMouse.time = 0; // Adding this line fixes it!
//...
希望这可以帮助!
注意:我也希望得到更全面的解释;但是,对我来说,未初始化的字段闻起来像是未定义的行为!我已经为该字段尝试了各种其他值(即不为零),time
但还没有找到一个有效的值。
devblogs 上 的讨论可能会有所帮助。这句话似乎很相关:
谁知道如果程序检查时间戳并注意到它们来自未来或已经回到过去,会造成什么样的破坏。
推荐阅读
- list - 为什么在获取列表中的所有其他元素时会得到额外的元素?
- javascript - 错误:尝试登录时未知身份验证策略“本地”
- python - 如何使用文本文件中的两个字符串创建要在文本文件中搜索的范围并在这两个字符串之间进行搜索?
- asp.net-core - 对于输入文件类型,合适的数据模型类型是什么?
- css - 如何使用不会使选择变大的工具提示进行材质 UI 选择?
- node.js - 如何将 VueJS 前端路由重定向到 Express 后端路由?
- kubernetes - 如何判断导致 helm chart 部署失败的原因?
- sql - LINQ 或导航属性命令检索一对多数据
- solr - 如何在 Solr 4.3 上添加身份验证
- c++ - Qt 应用程序使用来自 Linux 中用户图标主题的图标