我试图为一个没有编程接口的游戏做一个游戏机器人。例如,我如何制作一个程序来播放窗口的扫雷游戏?不是让我自己的扫雷游戏和程序解决它,而是窗口的游戏。我只是在寻找像这样的程序所使用的方法。我是否需要使用屏幕捕捉软件来定义一组像素的意思和界面呢?
发布于 2016-03-22 21:04:55
对于Windows应用程序,可以使用SendMessage向另一个应用程序发送模拟鼠标和键盘命令。
您将需要获得HWND,您可以使用FindWindow或类似的工具获得它(您的Windows版本会影响到这一点,因为在旧版本的Windows上,您会迭代窗口句柄以查找可执行文件名,而在Windows 8和更高版本上,如果没有特殊处理,则无法看到某些应用程序-- MSDN将提供有关这方面的文档)。
使用GetDC获取非DirectX应用程序屏幕的屏幕截图,然后BitBlt将屏幕复制到自己的位图,然后是ReleaseDC。例如,与扫雷,如果你的“机器人”记得以前的截图,做一个区别,这与当前,以找到位置已经改变了自上一轮。
在播放时,您应该能够使用调试器或进程监视工具来标识您需要发送的窗口消息。
对于其他应用程序/平台,您通常会发现类似的方法是有效的,因为它们是调试器、系统监视器等的最高级别挂钩(还有更低的,但如果您处理它们会导致问题)。
具体而言,对于web应用程序来说,跨站点脚本限制将使使用这种方法变得困难。对于web应用程序,有两种正常的方法可以实现这一点: 1)在"bot“应用程序中嵌入一个web浏览器控件,并在页面加载中注入额外的javascript (因为应用程序控件是动态的),但是这会变得更加困难,因为您可以有多个层和多个框架,以及附加的API (HTML5、WebGL等)。2)使用独立的html/javascript引擎只呈现/执行所需的客户端代码,然后直接修改状态(例如,如果您想模拟按钮按下发送到远程服务器,只需使用javascript引擎直接调用按钮处理函数。
任何解决方案都将取决于要模拟的应用程序,因此您将无法构建一个通用的"bot",如果这是您的意愿。
请注意,OSes保护它们的应用程序,因此,如果您不非常小心的话,访问正在运行的应用程序的内存将是非常危险的,并且几乎不可能知道内存的作用。考虑到Windows动态地将大多数DLL加载到随机基址作为安全措施,应用程序通常使用GlobalAlloc (或非Windows等效的)存储大部分数据,因此即使您在下次运行应用程序时发现了所关心的数据,它也不会在相同的位置。
这通常是合法的(就像你不会进监狱一样),尽管你的会员资格或软件许可证可能会被暂停,在极端情况下,你可能会被罚款或起诉。客户端应用程序不太可能有这样的限制,因此,如果您将应用程序与奇怪的消息充分混淆,那么最糟糕的情况就是导致应用程序崩溃或挂起。
发布于 2016-03-15 23:53:58
我认为这可能是非法的,但编程挑战是值得的。
我认为有两种方法可以做到这一点。您可以使用像openCV这样的库来识别模式并使用它,但是它会很慢,所以对于时间不重要的小游戏是有限制的。
或者,您可以永久地编写一个读取游戏进程RAM的软件来分析它。我想作弊引擎就是这样工作的。
发布于 2016-03-22 22:20:29
为了捕获目标应用程序的窗口,您不需要低级别的Win32 API调用。您应该可以使用.NET来完成这个任务。请参阅http://www.codeproject.com/Articles/12898/Screen-Capturing,一旦您有了目标HWND (请参阅Matt的答案),您可以使用Control.FromHWND()创建一个.NET控件。然后在一个capture()中Bitmap窗口。
自动化的东西:在一个简单的游戏,如扫雷,你需要看的项目被组织成一个网格。您只需扫描从目标窗口读出的位图,并检查特定位置的像素。一般情况下需要更复杂的工具。OpenCV,正如girod_s所建议的,应该是一个很好的猜测。
马特·乔丹已经说过其他的话了。
如果您想确保保持在法律方面,不要试图直接在目标应用程序的RAM上工作。但是,您仍然应该查看该应用程序的许可条款(请参阅我对girod的答复的评论)。
https://stackoverflow.com/questions/35968007
复制相似问题