使用 C# 和 AutoIt 向 Flash 游戏发送消息

Posted

技术标签:

【中文标题】使用 C# 和 AutoIt 向 Flash 游戏发送消息【英文标题】:Sending messages to a Flash game with C# and AutoIt 【发布时间】:2010-10-25 01:09:21 【问题描述】:

我正在为 Flash 游戏制作机器人,并且我已经知道如何将所有 AutoIt 函数导入到我的 C# 代码中。

string title = "Minesweeper";
string full = auto.WinGetTitle(title,"");
string handle = auto.WinGetHandle(full, "");
if (auto.WinExists(full, "") == 1)
    textBox1.Text = "window exists";
addressBox.Text = full;

for (int r = 1; r < 40; r++)

    auto.ControlClick(full, "", "", "left", 2, r * 10, r * 10);
    //auto.ControlClick(handle, "", "", "left", 2, r * 10, r * 10);

(我很确定未注释的应该是带手柄的,反之亦然,但这适用于Minesweeper。)

所以它适用于 Minesweeper 并且不需要它是活动窗口。当我尝试让它在我的 Flash 游戏上运行时,它需要 Internet Explorer 窗口处于活动状态。这是 Flash 需要的东西,还是在游戏最小化时我可以做些什么来使它工作?

这不必使用 AutoIt 导入来完成。我也曾一度尝试来自 user32 的SendMessage,但这对我来说根本不适用于 Flash 内容。

我只是在一个随机网站而不是 Flash 网站或扫雷器上对此进行了测试,由于某种原因,如果我从 Autoit 脚本程序中执行代码,而不是从我的 C# 程序中执行,代码可以正常工作...

2012 年 6 月 20 日:我很确定这与句柄的传递方式有关。我已经通过调用 AutoIt EXE 文件并使用从 C# 代码中获得的句柄作为参数进行了一些测试,我必须添加一个 0x 到它,然后在 AutoIt 代码中我必须从一个字符串到 HWnd,所以这可能是什么,在这种情况下我不知道该怎么做,因为导入的函数依赖于句柄的字符串输入。

【问题讨论】:

你是如何将 autoit 函数导出到 c# 的?我只是好奇。 lancelarsen.com/Blog/tabid/72/EntryId/48/… 有一个带有资源的站点,其中有人创建了一个从 DLL 库导入函数的类。但我认为,如果你只包含库,你不一定需要使用他制作的那个类。我这么说是因为他的帮助类不包含所有作为导入的函数,但无论如何您都可以访问所有 autoit 方法。 【参考方案1】:

您可能想尝试排除窗口句柄和变量处理问题。不需要使用 WinGetTitle,“扫雷”窗口标题应该可以正常工作。根据我在 Windows 7 中的 AutoIt v3 Window Info 工具,Minesweeper 窗口的标题和类别都是 Minesweeper。编码太难了

auto.ControlClick("[TITLE:Minesweeper; CLASS:扫雷], "", "", "左", 2, r * 10, r * 10);

可能会奏效。有关其工作原理的更多信息,请参阅 AutoIt 帮助文件中的高级窗口说明。如果这仍然不起作用,请在帮助文件中查找 WinTitleMatchMode。它允许您在窗口标题匹配中设置一些宽大规则,这可以让您更轻松。

AutoIt X 是 AutoIt 的 DLL/COM 控制版本,它是您将 AuotIt 添加到任何支持 DLL/COM 的语言的方式。以防其他人想知道how you would use AutoIt in C#。不幸的是,AutoIt X 在主要语言的开发和测试方面经常落后。尽管没有理由认为您的问题是由仅提供 AutoItX 项目背景的错误引起的。如果您还没有,您应该将此问题的副本发布到ActiveX/COM Help and Support (AutoItX) 论坛。多年来,根据我的经验,AutoIt 最棒的地方之一就是社区(这里并没有太多变化)。该语言的一些开发人员经常光顾该特定论坛部分,他们很乐意提供帮助。

至于您的 6 月 20 日 注释,AutoIt 将所有变量视为字符串,直到它检测到它的特殊之处。它不知道一个值是十六进制的,除非它以你提到的 0x 开头。这在过去给我带来了各种奇怪的问题。我有几次不得不将零添加到变量中,以便 AutoIt 在之后正确评估它。 AutoIt3 不会经常发生这种情况,但请记住一些事情。

如果您需要任何 AutoIt 参考代码AutoIt forum have made Minesweeper bots 的大量成员,您可以查看并可能会看到一些有用的东西。

【讨论】:

谢谢,我一定会研究那些我只是使用扫雷来学习的资源,但这仍然不能解决我的 Flash 游戏问题。但我会对你展示给我的内容做更多的修改 好时间快到了,所以我给你赏金即使我并不完全满意我希望找出如何点击网络浏览器,我已经可以在扫雷正如我所解释的,但你的答案是最好的,谢谢【参考方案2】:

确保以管理员身份运行 C# 程序。这是我可以看到的一种方法有效而另一种方法无效的唯一区别。

【讨论】:

以上是关于使用 C# 和 AutoIt 向 Flash 游戏发送消息的主要内容,如果未能解决你的问题,请参考以下文章

如何让 AutoIt 参考在 C# 中工作?

如何通过Autoit来模拟点击网页某个位置

编程语言:C++和C#,哪个更适合开发大型游戏?

C++与C#相比,哪个更适合开发大型游戏?

C# 和 Flash 集成

C#中如何向指定的窗口或程序发送按键?