如果没有办法让你的程序告诉另一个程序按下了一个键?我想做一个程序来击败一些游戏。所以任何资源或例子都会受到赞赏。
更新:所以一种方法是模拟击键,那么有哪些方法可以做到这一点(用任何语言)?
答案 0 :(得分:49)
我曾经写过一堆机器人(从Pogo游戏到Yohoho Puzzle Pirates)。对于Windows,您通常要么发送Win32事件来模拟鼠标移动,要么在实际点击鼠标时欺骗窗口之间发送的实际低级别消息。其中很多实际上取决于程序的反应方式(通过接受带有坐标的消息,或者在Java的情况下,立即读取鼠标坐标)。 “自动化”部分通常涉及读取屏幕并编写用于确定状态的启发式算法或算法,但也可以像数据包嗅探一样好(扑克实施中的大量信息)或直接读取内存位置的hacky。非常大的“领域”,并且记录很少,因为它非常有利可图并且不难进入。
对于密钥,请尝试CodeProject:
http://www.codeproject.com/KB/cpp/sendkeys_cpp_Article.aspx
和消息:
http://www.codeproject.com/KB/threads/sendmsg.aspx
您最好的选择是学习使用Win32 API发送消息,然后使用类似Spy ++或其衍生物的东西来“逆向工程”KeyPresses和鼠标移动如何发送到窗口。
Java有一个非常便携的Robot类,它能够:
如果你正在寻找快捷方便,我会给你一个机会。
这在互联网上的其他地方进行了深入的描述,但大多数机器人遵循简单的状态机程序流程。您阅读屏幕(或数据包或内存),根据您的读数和过去的数据找出您所处的“状态”,进行计算,然后将结果发送回程序。
阅读屏幕可能很困难,但如果您多次考虑,可以更容易,相对于窗口有一些“幸运”像素,可以让您了解程序所处的状态。找到这些像素的过程可以自动化。
答案 1 :(得分:4)
有几种机器人。从我记得以前我曾经玩CS(很久很久以前)
一些机器人使用应用程序本身的库来检查环境(地图,玩家等等......)机器人也使用库来控制移动。我怀疑有很多机器人实现调用鼠标消息告诉游戏如何移动等...
一些机器人模拟应用程序级协议(如果它是多人游戏)。换句话说,游戏甚至不需要运行。机器人可以在虚拟游戏中运行。
我要反对另一张海报的建议:编写一个游戏机器人可能比实际玩游戏更有价值,并且对它们如何工作感到好奇是一个好兆头。 :)
答案 2 :(得分:4)
某些程序(例如在MMORPG中为您研磨的程序)只是模拟击键。执行此操作的工具是AutoIt。
对于实际上自己玩游戏的机器人,我并没有真正对它们做任何事情,但我假设它们会使用某种预定义的动作集,可能是启发式的,但不太可能。
答案 3 :(得分:4)
这个概念中最大的缺陷不是输入,而是游戏输出。你的机器人不能随便按键,它需要知道什么是“正在发生”。很少有游戏允许您查询这些数据,这将使您的机器人解决一个非常棘手的问题 - 将每秒60帧的2D视觉数据转换为虚拟空间。
那里有精确的游戏,不仅允许机器人玩家,而且鼓励他们。 Open RTS就是其中之一,但也有更简单的问题,例如GUN-TACTYX和crobots,这些都是很好的起点。
答案 4 :(得分:2)
Bots将充当游戏(服务器)的客户。然后,他们可以发送适当的数据,就像用户可能手动发送一样。机器人(客户端)将分析来自服务器的数据(“某人即将从左侧攻击”),等等。然后,客户端应该能够计算最佳移动并将适当的数据发送到服务器以执行它。
我不确定这是否适用于所有游戏。
答案 5 :(得分:2)
这在很大程度上取决于游戏。 例如,我为Travian(这是一个在线游戏)制作了一个机器人,它使用Internet Explorer activeX自动化移动。我在c#中使用该应用程序,并让它做了大约30分钟的事情。在activeX上调用方法很简单,它可以执行填写文本字段或单击按钮等操作。例如,登录我使用了以下内容:
var inputs = web.Document.GetElementsByTagName("input").
Cast<HtmlElement>();
var nume = inputs.First(h => h.GetAttribute("type") == "text");
var pass = inputs.First(h => h.GetAttribute("type") == "password");
var login = inputs.First(h => h.GetAttribute("type") == "image");
var form = web.Document.GetElementsByTagName("form")[0];
nume.SetAttribute("value", "user");
pass.SetAttribute("value", "pass");
login.InvokeMember("Click");
对于那些基于桌面的游戏来说,事情变得更加复杂。 Windows允许一个应用程序将消息发送到另一个应用程序,所以我猜你可以使用它来发送消息到游戏(虽然这适用于使用directX输入的游戏我不知道)
答案 6 :(得分:1)
像你描述的机器人将只是模拟按键和鼠标移动/点击,因此游戏无法分辨人类是在玩还是其他程序。它根本不需要与游戏接口。
答案 7 :(得分:1)
当你说“控制程序”时,请考虑如何控制程序。大多数人接受键盘/鼠标输入。
如果您编写一个程序来模拟键盘/鼠标输入,那么就去吧。
这样做的必然结果是,如果程序接受通过输入框传递的参数,则编写一个程序来发送参数,就好像它们是通过输入框发送的一样。
这就是所有机器人的工作方式。希望它为你带来一些亮点!
编辑:这是绝大多数机器人的工作方式: - )
答案 8 :(得分:1)
您可以使用Robot类在Java中模拟鼠标移动/点击和键盘输入。它还可以让你拍摄屏幕截图。
答案 9 :(得分:1)
我认为AutoIT是使用此类软件的一种很好的语言。即使我没有使用它来构建机器人,发送点击和按键也很容易。
答案 10 :(得分:1)
我的理解是,大多数高端游戏机器人使用系统调用将自己映射到游戏客户端的内存空间,对其布局进行反向工程,并直接操纵客户端程序的内部变量。这比我为了好玩而做的工作更多。
答案 11 :(得分:-2)
为此你需要了解编程。 但是,有些程序允许您使用可视方式进行编程。对他们来说,你不需要能够编程。 一个例子是程序Kibor。它专为您的目的而设计,并具有可视化编辑器,您可以使用它来创建带有方框图的机器人。 Description of the program Kibor
它有许多现成的机器人功能。甚至还有一个内置的文本识别模块 Screenshot Kibor. Text recognising