3

我正在编写一个与 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);
}

为了在浏览器选项卡中单击游戏,我应该做些什么不同的事情?

4

1 回答 1

1

事情不会那么简单:

BM_CLICK 消息假定窗口处理程序的所有者处理 BM_CLICK 消息。这是在处理“低级”消息(例如鼠标向下/向上、键盘按下等)时生成的“高级”消息。在 Windows 标准控件(例如按钮)的情况下,这发生在场景下,但我不相信浏览器(或 flash 插件或其他)使用标准 Win32 控件来呈现其页面,因此它可能会或可能不会处理鼠标点击/键盘按下并发出 BM_CLICK 事件。

大多数版本的 Visual Studio(甚至是一些 C++ 表达版本)中都有一个很棒的工具可以帮助您完成任务,称为 Spy++。该工具允许您“遍历”窗口句柄结构、选择窗口(使用 Spy->Log Messages 中有些奇怪的查找工具)并记录特定窗口处理的事件。

根据此工具,在 Chrome 中按下您的问题中的“C#”标签按钮不拥有句柄并查看渲染控件上的事件,它没有创建 BM_CLICK 事件。

于 2012-11-27T01:55:22.723 回答