使用WindowFromPoint P / Invoke来获取浏览器选项卡的句柄

时间:2012-11-26 23:53:10

标签: c# .net pinvoke

我正在编写一个与Web浏览器游戏交互的C#应用​​程序(不是出于恶意目的,只是为了应对自动化的挑战),并通过移动鼠标,单击然后将鼠标移回上一步来实现交互。点。

我现在要做的是在不移动光标的情况下点击该点,以便在鼠标运行时移动鼠标不会导致错误点击。我找到了WindowFromPoint和SendMessage钩子,我可以用来点击这个位置,在我的测试中我能够让这个组合起作用。但是当试图让这个钩子组合在我的Chrome网页浏览器上工作时,游戏所在的位置就无法点击。

我假设正在收集错误的句柄,因为Chrome是如此复杂。但我认为它的工作方式是WindowFromPoint将为我提供当前打开的浏览器选项卡的句柄,因此SendMessage将能够执行我想要的点击。

以下是我正在使用的代码,start和end都是位于我想要点击的位置的Point对象:

IntPtr hWnd = WindowFromPoint(start);
if(hWnd != IntPtr.Zero) {
    SendMessage(hWnd, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
    IntPtr hWnd2 = WindowFromPoint(end);
    SendMessage(hWnd2, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
}

为了在浏览器标签中点击游戏,我应该做些什么?

1 个答案:

答案 0 :(得分:1)

它不会那么简单:

BM_CLICK消息假定窗口处理程序的所有者处理BM_CLICK消息。这是一个更高级别的"当"较低级别"时生成的消息处理消息(例如鼠标按下/向上,键盘按下等)。 对于Windows标准控件(如按钮),这种情况会在幕后发生,但我不相信浏览器(或Flash插件或其他)使用标准的Win32控件来呈现其页面,以便它可能处理或不处理鼠标点击/键盘按下并发出BM_CLICK事件。

在大多数Visual Studio版本(甚至是一些C ++表达版本)中都有一个很棒的工具可以帮助你实现名为Spy ++的追求。 这个工具允许你走路"窗口句柄结构,选择窗口(使用间谍中的奇怪的查找器工具 - >日志消息)和特定窗口处理的日志事件。

根据此工具按下" C#" Chrome中您的问题中的标记按钮没有句柄,并且在渲染控件上查看事件时没有创建BM_CLICK事件。