在后台窗口中模拟鼠标点击

Posted

技术标签:

【中文标题】在后台窗口中模拟鼠标点击【英文标题】:Simulate mouse click in background window 【发布时间】:2014-10-11 22:38:22 【问题描述】:

我正在尝试使用 SendMessage 将鼠标点击发布到背景窗口 (Chrome),这可以正常工作,但每次点击后都会将窗口置于前面。有什么办法可以避免吗?

在有人说这是一个重复的问题之前,请确保另一个主题确实提到了不激活目标窗口,因为我找不到。

更新:啊哈,隐藏窗口几乎可以解决问题。它按预期接收模拟的鼠标/键盘事件,并且不会显示在屏幕上。但是,我只能勉强使用自己的鼠标在计算机上导航,并且键盘输入完全中断。

所以我的问题是,向窗口发送消息如何影响其他应用程序?由于我实际上并没有模拟鼠标/键盘事件,所以其他窗口不应该完全忘记这一点吗? 它是否可能与收到WM_LBUTTONDOWN 时调用SetCapture 的窗口有关?除了挂钩 API 调用(对于这样一个小任务来说,这将是非常非常丑陋的)之外,我该如何避免这种情况?

【问题讨论】:

为什么还要将点击发送到 Chrome?如果这如您所描述的那样有效,那么对我来说这似乎是一个很好的安全功能。 您正在编写 Clicker Heroes 机器人吗? :P 【参考方案1】:

系统提供的默认处理(通过DefWindowProc)导致窗口出现在前面(单击时)作为对WM_MOUSEACTIVATE消息的响应,而不是WM_LBUTTONDOWN

Chrome 响应WM_LBUTTONDOWN 的事实表明这是 Chrome 专门做的事情,而不是您可以通过某种方式阻止的默认系统行为。

Chrome 的源代码可用;我建议你看看它,看看它是否确实是 Chrome 自己在做的事情。如果是这样,您能够阻止它的唯一实用方法(除了编译您自己的 Chrome 版本)是将代码注入 Chrome 的进程并对其主窗口过程进行子类化。

【讨论】:

实际上,它是我试图点击的 Flash 应用程序,不确定 Chrome 是否决定在这种情况下鼠标点击会发生什么。但从它的行为来看,我几乎可以肯定它调用了SetCapture。我会尝试劫持该功能,看看是否有帮助。 @riv 鼠标点击必须通过 Chrome 才能到达您的 Flash 应用程序。我猜 Chrome 认为:如果有人弄乱了你的浏览器,你可能想知道它。我认为这是一项重要的安全功能。

以上是关于在后台窗口中模拟鼠标点击的主要内容,如果未能解决你的问题,请参考以下文章

易语言中!模拟鼠标点击无效

用鼠标中键点击网页,为啥不是直接跳到新的窗口,而是仍在原来的窗口?

vb后台模拟鼠标点击网页

delphi 后台模拟鼠标点击

如何写一个脚本模拟鼠标左键连续点击后台网页链接

如何模拟后台鼠标点击功能? SendMessage 和PostMessage 都无效。