IMM获取其他程序输入法状态 之 遇到的坑

最近几天尝试实现获取指定窗口输入法的状态需求。通过GetKeyboardLayout可以获取键盘布局,通过0x804能获取简体中文输入法。

但获取到中文输入法,仍想继续获取输入法的状态(中文输入/英文输入)。查阅资料后发现可以使用IMM实现。但IMM实现坑点满满。

 

坑点1:ImmGetContext函数

ImmGetContext函数目前只能获取当前进程下的IMM上下文,跨应用是无法获取的。跨应用需要SendMessage,WM_IME_CONTROL,IMC_GETOPENSTATUS(0x05)获取。

 

坑点2:上下文状态

绝大多数程序可以通过上述方法获取是否开启(通常开启为1)。但记事本为例外。获取记事本进程的返回值为0,貌似因为记事本用的是系统IME。

 

坑点3:输入法状态

再次使用SendMessage,WM_IME_CONTROL,IMC_GETCONVERSIONMODE (0x01)即可获取全角半角状态。和IME_CMODE_LANGUAGE进行按位与操作即可获得中英文状态(通用)。不同输入法的值是不同的

笔者电脑为win11,输入法为微软拼音,中文模式下获取的是1025,英文模式下是0;而搜狗输入法半角中文是1025,全角中文是1033

 

posted @ 2025-08-06 18:02  silomen  阅读(65)  评论(0)    收藏  举报