程序如何控制另一个程序?
机器人,他们是如何工作的? 他们告诉video游戏一个键被按下或鼠标被点击?
如果不是有办法让你的程序告诉另一个程序一个键被按下? 我想制作一个节目来打败一些游戏。 所以,任何资源或例子表示赞赏。
更新:所以一种方法是模拟击键,那么有什么方法可以做到这一点(在任何语言)?
我曾经写过一些机器人(从Pogo游戏到Yohoho Puzzle Pirates)。 对于Windows而言,通常要么发送Win32事件来模拟鼠标移动,要么在实际点击鼠标的时候欺骗窗口之间发送的低级消息。 很大程度上取决于程序如何反应(通过接受消息的坐标,或者在Java的情况下,立即读取鼠标坐标)。 “自动化”部分通常涉及阅读屏幕,编写启发式或algorithm来确定状态,但是也可以像包嗅探(在糟糕的扑克实现中有很多信息)或者像直接读取存储器位置那样的hacky。 相当大的“领域”,并没有文件logging,因为它是非常有利可图的,不难进入。
发送input
C / C ++(在Windows中)
对于键,尝试CodeProject:
http://www.codeproject.com/KB/cpp/sendkeys_cpp_Article.aspx
和消息:
http://www.codeproject.com/KB/threads/sendmsg.aspx
您最好的select是学会使用Win32 API发送消息,然后使用Spy ++或其衍生产品来“逆向工程”KeyPresses和鼠标移动如何发送到窗口。
Java的
Java有一个非常便携的Robot类,它能够:
- 从屏幕上读取像素。
- 控制鼠标。
- 发送密钥。
如果你想快速简单,我会给你一个机会。
基本逻辑
这在互联网上的其他地方有详细的描述,但大多数机器人都遵循一个简单的状态机程序stream程。 您阅读屏幕(或数据包或内存),根据您的读数和过去的数据找出您所在的“状态”,进行计算,并将结果发送回程序。
阅读屏幕可能很困难,但是如果你考虑很多次,相对于窗口有几个“幸运”的像素,可以让你知道程序处于什么状态。find这些像素可以自动化。
一些程序(例如在MMORPG中为您打磨的程序)只是模拟击键。 一个工具来做到这一点是AutoIt 。
至于实际上玩游戏的机器人,我还没有真正做过什么,但我假设他们会使用某种预定义的动作,也许是一种启发式的,但不太可能。
有几种机器人。 从我记得以前玩过CS(很久很久以前)
一些机器人使用应用程序本身的库来检查环境(地图,玩家等等)。机器人也使用库来控制移动。 我怀疑有很多的bot实现调用鼠标信息来告诉游戏如何移动等等。
一些机器人模拟应用程序级别的协议(如果它是多人)。 换句话说,游戏甚至不需要运行。 一个机器人可以运行在一个虚拟的游戏。
我会与另一张海报的build议背道而驰:编写一个游戏机器人可能是比实际玩游戏更有价值的一个练习,并且好奇它们如何工作是一个好兆头。 🙂
这个概念最大的缺陷不是input,而是游戏输出。 你的机器人不能随意按键,它需要知道什么是“发生”。 很less有游戏允许您查询这些数据,这将使您的机器人解决一个非常棘手的问题 – 将每秒60帧的2D视觉数据转换为虚拟空间。
那里有真正的游戏,不仅让机器人玩家,但鼓励他们。 打开RTS是其中之一,但也有更简单的像GUN-TACTYX和crobots这是很好的起点。
机器人将充当游戏(服务器)的客户端。 然后,他们可以发送适当的数据,就像用户手动发送一样。 机器人(客户端)将分析来自服务器的数据(“将要从左边攻击的人”),等等。 客户端应该能够计算出最佳的移动并将适当的数据发送到服务器来执行。
我不确定这是否适用于所有游戏。
这非常依赖于游戏。 例如,我为Travian(这是一个在线游戏)制作了一个bot,它使用了Internet Explorer的activeX来自动化移动。 我在c#中运行该应用程序,并得到它做了约30分钟的东西。 在activeX上调用方法很简单,只需要填写文本字段或者点击button即可。 对于login例如我使用的是:
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允许一个应用程序发送消息到另一个应用程序,所以我想你可以使用它来发送消息到游戏(尽pipe这对于使用directXinput的游戏是有效的,我不知道)
像你这样的机器人只会模仿按键和鼠标移动/咔嗒声,所以游戏无法判断人是在玩还是在其他程序中。 它根本不需要与游戏进行交互。
您可以使用Robot类在Java中模拟鼠标移动/点击和键盘input。 它也可以让你拍屏幕截图。
我认为AutoIT是做这种软件的好语言。 即使我没有使用它来build立机器人,发送点击和键很容易。
我的理解是,大多数高端游戏机器人使用系统调用将自己映射到游戏客户端的内存空间,逆向devise其布局,并直接操纵客户端程序的内部variables。 这样做比我只是为了好玩而起作用。
当你说“控制一个程序”时,想想如何控制程序。 大多数接受键盘/鼠标input。
如果你写一个程序来模拟键盘/鼠标input,那么你去。
一个推论是,如果程序接受通过input框传递的参数,则编写一个程序来发送参数,就像通过input框发送参数一样。
这是所有机器人的工作。 希望能给你带来一些启示!
编辑:这是如何绝大多数机器人工作:-)