Python写游戏自动化辅助按键没有效果
斌哥说大家好,我是斌哥。今天要说的是用Python开发游戏辅助,这里指的是Python自动化实现的自动点击,自动打怪等操作。而非嵌入到游戏内的辅助,如果是这类辅助,请使用lua,如果游戏允许lua寄生的话。现代网络游戏对键盘处理,大致分为以下2种:对键盘响应要求不高,采用普通按键方式对键盘响应速度要求很高,采用高速按键键盘方面,如果是纯鼠标或者键盘操作较少的游戏,那么基本上用pyautogui这类模块或者自己封装WindowsAPI中的keybd_event即可搞定。而对于那种鼠标键盘互动的游戏,例如3D射击、moba、赛车等游戏,对键盘要求极高的游戏。我们用pyautogui或者是API提供的keybd_event,再者通过windows消息发送按键消息,都会发生这样的一幕:无效。这种无效,不是代码有问题,也不是运行过程发生问题,而是仅仅的因为一个问题:那就是Windows上对键盘要求高的网络游戏,都采用的DirectX框架中的DirectInput接口。按键无效(游戏采用DirectInput接口)的解决办法解决办法只有两种:1、通过winio这类驱动级的按键库(这个过程是汇编出真实的键盘事件),再者如果汇编水平不错,可以考虑自己写。Python也有winio的模块,叫rabird.winio,不过相当不友好,只能在windows调试模式中运行。2、响应DirectInput支持的按键代码为什么pyautogui和keybd_event在游戏中无效?开始之前,首先要清楚,为什么pyautogui和keybd_event在游戏中无效?keybd_event是WindowsAPI的一员,它的作用是模拟出windows环境中的按键。其原型为:VOIDkeybd_event(BYTEbVk,BYTEbScan,DWORDdwFlags,DWORDdwExtralnfo);参数:bVk:定义一个虚拟键码。键码值必须在1~之间。bScan:定义该键的硬件扫描码。dwFlags:定义函数操作的各个方面的一个标志位集。应用程序可使用如下一些预定义常数的组合设置标志位。KEYEVENTF_EXTENDEDKEY:若指定该值,则扫描码前一个值为OXEO()的前缀字节。KEYEVENTF_KEYUP:若指定该值,该键将被释放;若未指定该值,该键将被按下。dwExtralnfo:定义与击键相关的附加的32位值。要知道,任何操作系统和键盘交互过程都是这样的:用户按下按键-键盘驱动-操作系统产生键盘事件-响应而我们的keybd_event只是提供了keybd_event接口规定的虚拟键盘码,例如虚拟键盘码F1定义为:#defineVK_F10x70,而游戏的键盘接口却是用的DirectInput,DirectInput中虚拟键盘码则是这样定义的:#defineDIK_F10x3B一个是0x70一个是0x3b假设这样一个场景,Python程序需要在某个游戏中按下F1按键,Python调用keybd_event产生键盘事件,0x70被传到DirectInput中,这时DirectInput会以为用户按下了日文键盘中的KANA键,因为DirectInput键盘码宏就有这样的定义:#defineDIK_KANA0x70至于pyautogui这类模块为什么一样无效,其实很简单,因为他们就是在方法内调用了keybd_event解决办法——SendInput在呼唤你事实上,无论是keybd_event还是mouse_event(用于处理鼠标的winAPI)都是SendInput的简单封装。我们用SendInput可以解决更复杂的操作,就比如模拟DirectX的DirectInput键盘事件。DX键盘码:
上一篇文章: 双飞燕键鼠套装FG1010,对99元价位 下一篇文章: 教你彻底解决windows自动唤醒
转载请注明:http://www.abuoumao.com/hyls/9997.html