6

我正在为 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。)

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

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

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

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

4

2 回答 2

4

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

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

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

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

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

如果您需要任何 AutoIt 参考代码,AutoIt 论坛的许多成员都制作了扫雷机器人,您可以查看并可能会看到一些有用的东西。

于 2009-06-21T14:50:43.810 回答
1

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

于 2009-06-20T14:23:25.253 回答