BattlefieldChat
BattlefieldChat copied to clipboard
External Chinese input tool for Battlefield 1 / 战地1 外置中文输入工具
全屏输入的一点建议
前几天我也研究了几天战地的中文输入,做了一个玩具级别的输入工具。因为我没有逆向的相关经验,输入缓冲区的地址往上找了两级就不会了,所以我在每局开始都得先在输入框输入最长字符串,使输入缓冲区地址不再变化,自行搜索地址,然后填入我的小工具。 不过我这个工具也有好的地方,我是通过注册全局热键呼出的,程序接到热键消息后就把窗口激活然后置顶。由于战地1是全屏独占的,失去焦点后会最小化。在工具输入完成发送后,程序模拟按下键盘的 ALT+Tab,自动切回战地。 最大的痛点是不能全屏使用体验都不怎么好,所以找了很多资料,也就找到你这儿了。发现你把窗口化下的解决方案弄得比较完整了。 我分享一下我后面的研究方向: 全屏游戏似乎用 ImmDisableIME 禁用了输入法(自己写程序试过,症状和战地一样),有没有哪个 API 能够重新打开IME功能?(搜索了一段时间,没找到方案) 如果无论如何都不能打开这个窗口的 IME 功能,那么开启新的输入框架 TSF 是否可行? 如果实在不能在游戏内使用输入法,那可不可以在游戏外创建另一个拥有窗口的进程,把游戏内的击键传给这个进程(或者这个进程有办法在后台知道用户的击键)进行 IME 输入,这个进程把 IME 消息通过 SendMessage 发给游戏窗口,游戏内注入的代码就能响应IME消息了。 总之就是要么游戏窗口自己能打开输入法,要么想办法在游戏全屏不失去焦点的同时让另一个窗口能进行输入法输入。不管是谁,能产生IME消息就解决了。接收IME消息自绘输入窗口已经有现成的方案了。 最后有一个更麻烦的方法,就是在游戏内置输入法。游戏内键盘按下是有 WM_Char 消息的。 做这些有一个前提,战地的反外挂程序不会打扰我们吧?
全屏游戏检测
- SHQueryUserNotificationState() == QUNS_BUSY || QUNS_RUNNING_D3D_FULL_SCREEN - IDirectDraw7::TestCooperativeLevel() == DDERR_EXCLUSIVEMODEALREADYSET