首先说明这方法支持 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 写了个例子:
原理就是用一个 plus 控件(参考:使用 plus 控件制作精美界面)跟着鼠标走,你可以用代码画得更酷一些,plus 控件可以直接显示图标、文字图标、动画这些 …… 当然这种事情轻快实用更重要,动画太多不一定好。
源代码见 aardio 自带的范例:
昨天有人问我要让鼠标跟着光标走怎么做,这个也简单,用 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();