我试图为没有程序化界面的游戏制作游戏机器人。例如,我如何制作一个播放Window的扫雷游戏的程序?不是制作我自己的扫雷游戏,而是编写解决方案,而不是窗口游戏。我只是在寻找用于此类计划的方法。我是否需要使用屏幕捕获软件并定义一组像素的含义和界面?
答案 0 :(得分:1)
我认为这可能是非法的,但编程挑战是值得的。
我认为有两种方法可以做到。 您可以使用像openCV这样的库来识别模式并使用它,但它会很慢,所以时间不重要的小游戏是有限的。
或者,您可以永久编写一个读取游戏进程RAM的软件来进行分析。我认为Cheat引擎就是这样的。
答案 1 :(得分:1)
对于Windows应用程序,您可以使用SendMessage
将模拟的鼠标和键盘命令发送到另一个应用程序。
您需要获得HWND
,您可以使用FindWindow
或同等版本(您的Windows版本会影响这一点,因为在旧版本的Windows上,您会迭代窗口句柄以查找可执行文件名称,而在Windows 8及更高版本中,某些应用程序在没有特殊处理的情况下是不可见的 - MSDN将提供相关文档。
使用GetDC
,然后BitBlt
将屏幕复制到您自己的位图,然后ReleaseDC
,抓取非DirectX应用程序屏幕的截屏。例如。与扫雷一起,如果你的" bot"记得上一个截图,在它和当前之间做一个差异,以便找到自上一回合以来发生过变化的位置。
您可以在玩游戏时使用调试器或进程监视器工具来识别需要发送的Window消息。
对于其他应用程序/平台,您经常会发现类似的方法是有效的,因为它们是调试器,系统监视器等的最高级别的挂钩(并且有较低的挂钩,但是如果你弄乱它们会导致问题)
对于Web应用程序而言,跨站点脚本限制将使得使用此方法变得困难。有两种常规方法可以使这些工作适用于Web应用程序: 1)在您的" bot"中嵌入一个Web浏览器控件。应用程序并在页面加载时注入额外的javascript(因为应用程序控件是动态的),但由于您可以拥有多个图层和多个框架以及其他API(HTML5,WebGL等),因此会变得更加困难。 2)使用独立的html / javascript引擎根据需要仅渲染/执行尽可能多的客户端代码,然后直接修改状态(例如,如果要模拟按下的按钮,请发送到远程服务器,只需使用javascript引擎直接调用按钮处理函数。
任何解决方案都将取决于要模拟的应用程序,因此如果您想要的话,您将无法构建通用的#bot;#34;
请注意,操作系统会保护他们的应用程序,因此如果您不是非常小心,那么访问正在运行的应用程序的内存将会很危险,并且弄清楚内存的作用几乎是不可能的。考虑到Windows动态地将大多数DLL加载到随机基地址作为安全措施,应用程序通常使用GlobalAlloc
(或非等效的Windows)来存储大量数据,因此即使您找到了您关心的数据关于,下次运行应用程序时,它不会在同一个地方。
虽然您的会员资格或软件许可证可能被暂停,但这种情况通常是合法的(因为您不会入狱),在极端情况下,您可能会被罚款或被起诉。客户端应用程序可能没有这样的限制,所以在这些限制中,您可以做的最糟糕的事情是如果您将应用程序与奇怪的消息充分混淆,会导致应用程序崩溃或挂起。
答案 2 :(得分:0)
要捕获目标应用程序的窗口,您不需要低级别的Win32 API调用。您应该可以使用.NET执行此操作。见http://www.codeproject.com/Articles/12898/Screen-Capturing
获得目标HWND
后(请参阅Matt Jordan的答案),您可以使用Control.FromHWND()
创建.NET控件。然后在capture()
。{/ p>中Bitmap
窗口
对于自动化的东西:在像扫雷一样的简单游戏中,您需要查看的项目被组织为网格。您可以只扫描从目标窗口读出的位图,并检查特定位置的像素。一般情况需要更复杂的工具。正如girod_s所建议的那样,OpenCV应该是一个很好的猜测。
Matt Jordan已经说过其他一切了。
如果您希望确保合法的一面,请不要尝试直接在目标应用程序的RAM上工作。您仍然应该查看该应用程序的许可条款(请参阅我对girod_s&#39的回答的评论)。