获取输入法状态的正确方法,支持所有输入法

首先说明这方法支持 XP,Vista,Win7,Win8,Win10,Win11… 等所有操作系统,支持所有输入法,如果你真遇到不支持这个的输入法,那我佩服你敢用。

其实获取输入法状态很简单,网上很多代码和教程都是判断 IMC_GETCONVERSIONMODE 的返回值是否1,是否0,是否 1025,这样当然会时灵时不灵。

其实 IMC_GETCONVERSIONMODE 的返回值要按位判断。
例如判断输入法中英状态,用 aardio 要这么写:

3 & key.ime.control(,1/*_IMC_GETCONVERSIONMODE*/)

再例如判断输入法是否开启中文标点,应当这样写:
0x400 & key.ime.control(,1/*_IMC_GETCONVERSIONMODE*/)

aardio 提供了一个更简单的函数:
var openState,mode = key.ime.state();

上面第一个返回值表示输入法是否打开,mode 为1 表示半角标点, mode 为 2 表示全角标点,mode 为 3 表示开启中文标点。

我用 aardio 写了个例子:
screenshots
原理就是用一个 plus 控件(参考:使用 plus 控件制作精美界面)跟着鼠标走,你可以用代码画得更酷一些,plus 控件可以直接显示图标、文字图标、动画这些 …… 当然这种事情轻快实用更重要,动画太多不一定好。

源代码见 aardio 自带的范例:
image

昨天有人问我要让鼠标跟着光标走怎么做,这个也简单,用 aardio 这么写:

var caret = winex.getCaret() || winex.accObject.getCaret();
winform.imeState.setPos(caret.left+30,caret.top -30);

个人感觉跟着光标走合理一些,性能也好得多(因为跟鼠标必须追得很紧,跟光标可以放慢),上面的范例已经改成跟着光标走了。

如果你会 AHK ,其实只要改一下对 IMC_GETCONVERSIONMODE 返回值的判断就可以了。

另外 aardio 其实也支持 AHK ( v1, v2 都支持 ),aardio 与 AHK 的代码可以相互调用,写个简单的例子:

import win.ui;
/*DSG{{*/
var winform = win.form(text="嵌入 AutoHotkey 演示";right=599;bottom=399)
winform.add(
edit={cls="edit";left=17;top=18;right=565;bottom=374;edge=1;multiline=1;z=1}
)
/*}}*/

import ahk; 

//直接定义允许 AHK 调用的 aardio 函数
ahk.onTest = function(param){
    winform.edit.print( "winform.onTest被ahk调用",param ); 
}

//运行 AHK 代码
ahk.run( `
#Persistent ;
#NoTrayIcon ;
#include <aardio> ;

Test(){   
	; AHK 代码里调用 aardio 函数
    aardio.onTest({ x : 123, y : 456 })
}`);

//aardio 代码里调用 AHK 函数
ahk.Test();

winform.show();
win.loopMessage(); 
7 Likes

这功能我会添加到下一版 WubiLex 里,
WubiLex 也是使用 aardio 编写的开源软件,可将微软五笔词库一键替换为五笔86、98、091、新世纪码表,也可以将微软五笔一键替换为郑码、小鹤音形、表形码 …… 等输入法。

因为楼下提到 WubiLex 的更新频率 —— 这边补充说明一下:

WubiLex 其实已经活跃更新几年了,最新版本发布也没多久(才 2 个月 ),软件发展已经相对稳定,所以不会再去太频繁地更新版本。

WubiLex 是微软五笔的词库辅助工具,发布之后很受欢迎,百度贴吧一个关于 WubiLex 的讨论帖子回复超过 1200 帖,也是 GitHub 上 wubi 分类下 star 数最高的开源项目。

我选择微软五笔,以及编写 WubiLex 的原因在主页上有说明:

在 Win10 上我试过很多第三方输入法都有兼容性问题,换电脑麻烦,换码表麻烦,各种折腾以后还会出现一些窗口打不了字,或者打着打着突然卡死了,基本的打字都不行,其他花哨功再多能有什么用呢?!后来决定试一下微软五笔,用了一段时间,真是好用到停不下来。 但微软五笔还是存在一些问题: ………… 现在上面这些问题都可以使用 WubiLex 解决。但是不得不说,除了上面这些问题,微软五笔还是很好用的,简洁方便流畅,兼容性好。为了解决上述的问题,我自己写了一个开源软件 WubiLex

所以无论我选择微软五笔、还是编写 WubiLex —— 重视的都是简洁、实用、稳定。
WubiLex 也不会过多地去添加一些可能不是很必要的功能,当然,WubiLex 也提供了全部源代码,欢迎大家根据需要自行更新改进。

2 Likes

好像很厉害的样子,大佬能不能做成EXE啊

1 Like

好的,先看一下大家的需求,看看需不需要再改进一下细节,过些天提供 EXE,EXE 还要检测过白,有些工作要做。

2 Likes

期待中!

大佬快更新!

期待,大佬快出exe。

期待exe

这款软件我前不久试用过,没有继续用的原因有 2 个
1 是很久没更新了,看样子现在要更新了,太棒了
2 是因为我同时在用 mac,需要两侧词库同步,目前的实现方式是维护一个单独的 txt 文件,隔一段时间用输入法手动导入一下这个 txt 文件,但是这款软件导入的过程似乎并不方便(具体情况不太记得了)

感谢大佬出手制作跟随光标的版本,辛苦了。

WubiLex 其实已经活跃更新几年了,最新版本发布也没多久(才 2 个月 ),软件发展已经相对稳定,所以不会再去太频繁地更新版本。

关于您反应的“导入词库并不方便”,首先很抱歉给您带来的不便,为了更好地改进:
1、能否告知具体遇到了什么麻烦呢,如果 “不太记得”—— 这边有些为难了不知如何改进。
2、您在放弃 WubiLex 以后,使用的是什么方式为微软五笔导入词库呢?!如果有过程比 WubiLex 更方便的方法或软件 —— 欢迎您向大家推荐一下,以帮助其他同样觉得 WubiLex 不方便的用户。

大佬,4k屏那个标识显示有点问题,错位了
Snipaste_2022-05-13_02-06-18

我重新下载下来试了试

  1. 关于更新问题,很抱歉,可能是当初试了不少输入法所以记混了
  2. 我试了下五笔词库的导入导出,其实很方便,可能是我之前哪里没做对,同样非常抱歉

有2个功能是我很想要的,

  1. mac 上有个软件 keyboardholder,可以实现app首次启动,或者从后台切换到前台时,可自动切换到需要的默认输入法(中英文状态),我觉得这种方式形成肌肉记忆后比单纯的显示状态要更实用,不管是显示在任务栏还是鼠标旁边,都会有一个去找一下的过程
  2. 用capslock切换输入法(或中英文状态),这个属于是 mac 习惯,单纯提一提,毕竟有很多种方式可以实现,并不一定需要输入法

我当初弃用的原因可能和我提的两个需求有关,windows下没找到相关的软件,所以只能通过以下方法变相实现每次输入时都是从中文状态开始

  1. 只保留一个语言,一种输入法
  2. 关闭输入法的英文输入及相关切换功能
  3. 通过微软自带的ctrl+空格关闭输入法功能来实现中英文切换

自带五笔既不能只保留中文输入,也不能ctrl+空格来关闭输入法所以就弃用了,应该是这个原因 :sweat_smile:其他就是好像没有临时拼音功能?不过这个不是很重要

我刚好也是觉得跟着光标走更方便,鼠标经常都在某些莫名其妙的位置,不方便看呢。我把caret.top改为了+30,状态在光标下方,现在觉得很舒服。
但是我发现一个问题,在excel表格中这个不生效。

感谢耐心反馈,记错没关系,不必抱歉。
微软五笔确实有些设置不是那么直观。

微软五笔本就是不同窗口不同「中英文状态」,不需要安装其他软件。系统输入法设置里也可以勾选不同应用不同输入法。如果你想每次输入从中文状态开始,在系统五笔设置里也有这个选项。微软五笔可以用 Ctrl + 空格或 Shift 切换到英文状态(等价于关闭输入法)。

微软五笔的拼音混输功能其实挺不错的,可以直接打拼音长句,跟五笔编码不会冲突,简单方便。

现在做的输入状态提示,其实不是为了显示中英状态,还需要显示全角、半角、中英标点切换,大小写切换 …… 这些在输入时需要非常频繁地切换,如果在光标处有个提示,会方便很多 。

感谢反馈,
上次失误把这个窗口高分屏自适应给关了(其实是不必要的),最新版本源码已修正。

我刚才用最新版源码在 Excel 里试了一下可以正常显示,不过 WPS 表格目前不行。
你用我刚提交的最新源码试试。另外输入法的候选词默认在光标下方,你放在下方不冲突吗?

所以……什么时候会更新呢

不同窗口不同中英文状态和我的需求并不一致,我的需求是在任何时候(新打开软件、新切换过来的窗口,甚至是闲置一段时间之后)输入法的状态都是固定的某一个状态(如固定英文或固定中文 )

Ctrl + 空格属于上面这个需求达不成而延伸出来的需求,并不是很重要

系统设置里可以指定「新窗口默认中英文状态」,
感谢你的解释,理解你的需求,微软五笔个性化设置确实相对第三方五笔来说比较少。