在后台窗口中模拟鼠标点击
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 认为:如果有人弄乱了你的浏览器,你可能想知道它。我认为这是一项重要的安全功能。以上是关于在后台窗口中模拟鼠标点击的主要内容,如果未能解决你的问题,请参考以下文章