-
Notifications
You must be signed in to change notification settings - Fork 5
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
全屏输入的一点建议 #11
Comments
提供一个文档参考: https://docs.microsoft.com/en-us/windows/win32/dxtecharts/using-an-input-method-editor-in-a-game 虽然很老(甚至是xp时代的),但是很完整并且具有参考意义 目前我这边对全屏的实现大致在考虑两个方向
即使真全屏实现了,我也不会将其开源,原因如上,涉及到了过游戏反作弊,开源的话被拿去写进外挂的可能性太大 |
嗯,我说的重新打开IME是指和 ImmDisableIME 相反的功能。但并没有ImmEnableIME 这个API,目前的感觉用这个API禁用输入法是不可逆的。
至于有了 IME 消息之后如何绘制选词窗口等不是问题,已经有许多现成的解决方案了,你给的文档算一个,GitHub 也有源码。 |
ImmDisableIME不是啥大问题, 大不了下个hook直接拦截掉呗( |
对哦,那这样的话理论上是可行的了,就看实际上这么做会不会造成游戏 crashes。毕竟 DICE 禁用可能出于怕和 DirectInput 之类的东西冲突的原因。如果只是因为没实现 IME 而禁用,那完全可以拦截,然后自己捕获消息进行处理。 |
我觉得他们压根就没想过东亚区域是要用输入法的( |
全屏独占的游戏窗口里。可以通过让输入法窗口失去焦点,使用 |
@luojunyuan 感谢你的回复。在游戏可以使用输入法的前提下,使用你的方法确实可以免去手动实现输入法候选词窗口的麻烦。不过目前需要解决的是游戏不能使用输入法。 |
有一个奇葩方法。 |
@luojunyuan 可以的,赞。如果你已经实现,有兴趣的话可以提一个pr。我们很感激你对此做出的研究。 |
感谢研究, 如测试有效的话将在下一个版本中实现全屏输入 |
前几天我也研究了几天战地的中文输入,做了一个玩具级别的输入工具。因为我没有逆向的相关经验,输入缓冲区的地址往上找了两级就不会了,所以我在每局开始都得先在输入框输入最长字符串,使输入缓冲区地址不再变化,自行搜索地址,然后填入我的小工具。
不过我这个工具也有好的地方,我是通过注册全局热键呼出的,程序接到热键消息后就把窗口激活然后置顶。由于战地1是全屏独占的,失去焦点后会最小化。在工具输入完成发送后,程序模拟按下键盘的 ALT+Tab,自动切回战地。
最大的痛点是不能全屏使用体验都不怎么好,所以找了很多资料,也就找到你这儿了。发现你把窗口化下的解决方案弄得比较完整了。
我分享一下我后面的研究方向:
全屏游戏似乎用 ImmDisableIME 禁用了输入法(自己写程序试过,症状和战地一样),有没有哪个 API 能够重新打开IME功能?(搜索了一段时间,没找到方案)
如果无论如何都不能打开这个窗口的 IME 功能,那么开启新的输入框架 TSF 是否可行?
如果实在不能在游戏内使用输入法,那可不可以在游戏外创建另一个拥有窗口的进程,把游戏内的击键传给这个进程(或者这个进程有办法在后台知道用户的击键)进行 IME 输入,这个进程把 IME 消息通过 SendMessage 发给游戏窗口,游戏内注入的代码就能响应IME消息了。
总之就是要么游戏窗口自己能打开输入法,要么想办法在游戏全屏不失去焦点的同时让另一个窗口能进行输入法输入。不管是谁,能产生IME消息就解决了。接收IME消息自绘输入窗口已经有现成的方案了。
最后有一个更麻烦的方法,就是在游戏内置输入法。游戏内键盘按下是有 WM_Char 消息的。
做这些有一个前提,战地的反外挂程序不会打扰我们吧?
The text was updated successfully, but these errors were encountered: