aardio 文档

输入法状态跟踪提示条

aardio 标准库 key.ime.stateBar 用于创建输入法状态跟踪提示条对象。key.ime.stateBar 通过在输入光标处显示 2 个简单的图标 —— 可以让我们在输入文本前就可以及时查看中英、中英标点、全半角、大小写、多语言键盘布局等所有输入法与键盘状态。

key.ime.stateBar 对象基于以下函数、库、控件:

key.ime.stateBar 的主要应用就是流行的开源软件 ImTip

ImTip 运行效果:

ImTip 输入法提示效果图

1. 自定义显示规则 #

在 ImTip 的设置界面勾选『启用扩展规则』,然后再点击『编辑规则』按钮就可以在 aardio 开发环境中打开并使用 aardio 代码编写规则。

在 ImTip 的规则文件中需要使用全局变量 imeBar 访问 key.ime.stateBar 对象。

使用窗口类名过滤窗口的示例:

imeBar.onImeForegroundWindow = function(hwnd){

    //获取窗口类名
    var cls = win.getClass(hwnd);

    //检测类名,支持模式匹配 https://www.aardio.com/zh-cn/doc/guide/language/pattern-matching.html
    if(string.find(cls,"<禁止类名1>|<禁止类名2>")){

        //返回 false 禁止此窗口提示输入法状态
        return  false; 
    }

}

用户每次切换到新的独立窗口都会调用 imeBar.onImeForegroundWindow 函数,参数 hwnd 为切换到的目标窗口句柄,imeBar.onImeForegroundWindow 函数返回 false 会阻止在该窗口检测或显示输入法状态 。

当然,我们还可以检测其他任何条件,例如创建目标窗口进程的执行文件名,示例:

imeBar.onImeForegroundWindow = function(hwnd){ 

    //获取线程 ID,进程 ID。
    var tid,pid = win.getThreadProcessId(hwnd);

    //获取执行文件路径
    var path = process.getPath(pid);
    if(!#path) return;//普通权限无法获取管理权限进程文件名

    //转换为不含后缀的文件名
    var name = io.splitpath(path).name;

    //禁止提示的窗口
    if(IMTIP_DISABLED_APP[name]){
        return false; 
    }
}

//禁止提示的窗口
IMTIP_DISABLED_APP = {
    "禁止的执行文件名1" = true;
    "禁止的执行文件名2" = true;
}

在指定的窗口使用自定义的获取光标函数,以替代默认的 winex.caret.get() 函数:

imeBar.onImeForegroundWindow = function(hwnd){ 

    if(string.find(cls,"<自定义窗口类名2>")){

        /*
        自定义获取输入光标位置的函数。
        返回值必须与 winex.caret.get 兼容。
        细节请参考 key.ime.stateBar 源码
        */
        imeBar.getCaretEx = function(hwnd){

            //return caret,hFocus; 
        }

        return; 
    } 
}

imeBar.onImeStateChange 函数在检测输入状态后,显示输入状态前触发:

imeBar.onImeStateChange = function(hFocus,imeX,imeY,openNative,symbolMode,text,iconText){
    return true;//允许提示
}

在为 ImTip 的规则代码在界面线程中执行,我们还可以做一些有趣的事,例如扩展托盘菜单:

mainForm.onTrayMenu = function(menu){ 
    menu.add("打开 AI 助手",function(){
        import process.imTip;
        process.imTip(chat=""); 
    });

    menu.add();//分隔线
} 

2. 自定义外观样式

key.ime.stateBar 基于 plus 控件,而 plus 控件自定义外观样式非常方便,key.ime.stateBar 也继承了这个优点。

ImTip 的外观配置界面:

ImTip 外观配置

点击每个颜色方块都可以打开增强的调色器,所有颜色都可以指定透明度,调到完全透明就可以隐藏对应的图标或者背景。

ImTip 可以导入导入外观配置方案,方案文件实现上就是一个 aardio 代码文件。

在 ImTip 上提供了很多 外观方案,复制外观方案的 aardio 代码,然后在 ImTip 外观配置窗口点击粘贴按钮就可以了。

粘贴外观方案

以下是一个单图标显示方案的示例:

imeBar.imeSkin(/*ImTipConfig{{*/{
argbColor=16731983;
border={color=14395508;radius=6;width=0};
offsetX=13;
iconStyle={align="left";font={h=-17;name="imtip";weight=700};padding={top=4;right=6;left=1;bottom=0}};
background=16745333;
textRenderingHint=3;
openStyle={[1]={argbColor=16731983;background=16745333;border={color=14395508;radius=6;width=0};iconColor=-45233};[0]={argbColor=5291856;background=4700671;border={color=14395508;radius=6;width=0};iconColor=-11485360}};
align="left";
textPadding={top=0;right=0;left=-60;bottom=0};
tipChars={fullShape='\uF111';close='\uE801';hanja="漢";[1033]='\uF111';[2052]='\uF111';[1041]="あ";katakana="カ";halfShape='\uF042';[1042]="가";capital='\uF031';symbol='\uF111'};
width=55;
font={h=-18;name="imtip";weight=400};
iconColor=-45233;
foreground=16745333;
height=34;
offsetY=3;
iconTextRenderingHint=3;
valign="center"
}/*}}*/)

上面的外观方案背景透明,用红色表示中文模式,绿然表示英文模式,半圆表示半角标点,A 表示大写。

显示效果:
单图标方案显示效果

3. 兼容窗口类名 #

key.ime.stateBar 对象的 editorClasses 用于设置『兼容窗口类名』。

key.ime.stateBar 源码中 editorClasses 的默认配置如下:

namespace key.ime;
class stateBar{
    ctor(form){ 
        this.editorClasses = {
            ["AVL_AVView"]=1;["ConsoleWindowClass"]=1;["@WeChatMainWndForPC"]=1;["@ChatWnd"]=1;["#EXCEL6"]=1;
        };
    }
}

ImTip 输入法提示配置窗口的『兼容窗口类名』则是用分号分隔的字符串。

key.ime.stateBar 使用了多种不同的接口获取输入位置,但少数任何接口都不支持的应用窗口会退化为取鼠标输入指针位置。对于前述方式都不支持的窗口,可在『兼容窗口类名』中添加窗口类名(可使用 aardio 工具中的提供的窗口探测软件查看类名)。兼容类名写法规则如下:

4. 支持 Java 程序自动化接口 #

只要简单地提前导入 java.accessBridge 扩展库, key.ime.stateBar 就可以自动支持使用 Java 程序自动化接口定位光标插入点,不需要任何其他的步骤或操作。

import java.accessBridge


Markdown 格式