我正在编写一个与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);
}
为了在浏览器标签中点击游戏,我应该做些什么?
答案 0 :(得分:1)
它不会那么简单:
BM_CLICK消息假定窗口处理程序的所有者处理BM_CLICK消息。这是一个更高级别的"当"较低级别"时生成的消息处理消息(例如鼠标按下/向上,键盘按下等)。 对于Windows标准控件(如按钮),这种情况会在幕后发生,但我不相信浏览器(或Flash插件或其他)使用标准的Win32控件来呈现其页面,以便它可能处理或不处理鼠标点击/键盘按下并发出BM_CLICK事件。
在大多数Visual Studio版本(甚至是一些C ++表达版本)中都有一个很棒的工具可以帮助你实现名为Spy ++的追求。 这个工具允许你走路"窗口句柄结构,选择窗口(使用间谍中的奇怪的查找器工具 - >日志消息)和特定窗口处理的日志事件。
根据此工具按下" C#" Chrome中您的问题中的标记按钮没有句柄,并且在渲染控件上查看事件时没有创建BM_CLICK事件。