[第1001关] 极速构建一个输出热字符串输出的形码输入法

       如何一周内快速用ahk深度定制一个称手的音形码类外挂热字符串输入法?其实多数时间时花在准备上,当一切思路与条件俱备时写起来很快,可能写出来几个小时搞定,百分之九十九的时间在捋思路搭架子找干货。在此之前有无数的探路者从最初的柚子到后来的构思越来越复杂的影子,从无数次体验上发现构造一个小而精的热字符串输出脚本其实也没那么难!

早期的柚子实现思路非常简单:灼雪|十二个小时写一个属于你自己的输入法

首先我们得捋一下思路该如何一步步做?有哪些构造点?

  • 了解熟络形码的的上屏逻辑,打形码的习惯与拼音还是有所差别,所以要列好功能点才知道如何下手,例如:形码的上屏与顶屏逻辑,还有哪些键参与快捷选词、清空输入码、引导反查类码表等等
  • 以何种方式构建候选框:目前来说在ahk上成熟的方式有三种:
    • 系统自带提示框ToolTip。
    • 用自带Gui语法命令构建窗口+控件的方式。
    • 利用Windows自带的GDIPlus.dll构建候选窗口。

综合效率、性能与持久性来考虑,首先排除第2种,系统自带提示框ToolTip闪烁比较严重,且如果平时使用时       打快了,效率肯定也是跟不上,经过柚子、影子等早期的试水只有通过GDIP来构建是最为理想的方式。

  • 码表形式的选择目前方式有三种:
    1. 以字母编码与词条储存为变量的方式(早期柚子输入法如此实现),这种方式只能简单用来体验,扩展性低。如果词库量大(形码往往都是小词库,15万行以上的少见)的话非常吃内存,加载慢,因为是用的英文字母编码变量名非常容易冲突,所以不适用。
    2. 以挂载sqlite的方式挂本地二进制码表数据。这种方式支持大词库,如果处理得好的几十上百万应该问题不大,只是这种方式提词过度依赖本地词库得频繁读取,对硬盘的质量有些要求。形码词库量都小,基本都只10万左右,15万行以上的都少见。所以直接载入内存的方式比较适合。
    3. 加载txt文本+处理成关联数组以词典的方式进行检索,这种方式检索时响应极快,只是读取与处理成词典时所耗时间因设备而异。配置好的10万行左右加载读取+处理成词典实测2秒左右,配置稍次的设备可能要6~7秒左右。

综上所述,结合形码小而精的特点采用「加载txt文本+处理成词典」的方式比较适宜!且按键的映射(基础字母键a-z、数字选词、快捷选词、退格等)不能全局,不能干扰其它程序的使用,故采用区分状态的方式进行映射处理!可以设定一个变量为默认为中文模式的变量,加上ahk自带的#if+条件的方式来限定这些映射的热键会根据表达式的结果执行不同的操作,从而不影响全局。

  • 根据ahk自身不支持多线程的特点,有个问题需要解决:当切换中英文状态时肯定要绘制窗口进行状态提示且托盘图标同样会跟随状态变化,还得保证中英状态提示窗口要在指定时间后消失,这样不免与候选框的出现有所冲突,极大影响体验。故而可以采用多进程协同处理的方式,切换状态(中文、英文、大写)时只需向子进程发送消息,状态切换的后续操作都甩给子进程处理如此大大提升了输入法的流畅度!
  • 提词如果是采用数组词典的方式,首先要构思好字典内需要什么的结构?有的音形码有辅助码的需要另外当开启「逐码提示」时候选框要留位显示提示编码等注解信息,可能结合ahk的优势可能会开辟用户词条比如加些快捷命令、执行函数或标签等,如此得再留位当候选词条为快捷命令、执行函数或标签时标记一下状态在选词时可以根据些特征进行特别处理而不进行上屏操作。目前来看单条词条的结构为 [候选词条,注解提示,特殊指令处理标记],其它的需求根据开发进度及功能需求以后再加。一组编码对应多组词条,所以提词数组结构(txt读取转化为数组词典时也有处理如此处理)为:  [[候选词条1,注解提示,特殊指令处理标记][候选词条2,注解提示,特殊指令处理标记][候选词条3,注解提示,特殊指令处理标记]……]
  • 码表排版格式的确定:目前来说形码通行的格式有两种:
    • 极点格式(单行多义:一编码对应多个词条以单空格隔开为一行,编码无重复!)
    • 多多格式(单行单义:一编码对应单个词条以Tab符隔开为一行,编码可重复!,)

    为了编辑方便,当然是编码可重复的好,毕竟查重不是人干的事儿!所以可以确定采用多多格式!

  • 文件编码的统一:如今中文字集的需求越求越广且Unicode已是大势,所以规定统一为UTF-8(带签名)。
  • 基本参数功能点罗列:候选框横竖排切换单字模式(txt码表载入时过滤并处理一份单字字典)、候选词条字体与注解提示项字体可以分开设定配色多样化(折腾配色是个麻烦可,如果电脑装了「小狼毫」输入法的我们可以搞寄生,偷取并解析它现成的配色文件为已用)。类似于这种完全模仿借用全套配色参数:

      

调用gdip接口绘制候选框在高分屏上显示非常理想,质量无上限!

 

解决好并捋清上面的思路可以愉快的构造一个自己的形码输入法demo。

第一步、处理好主码表把主码表读取并解析为下面格式(另外也过滤并处理一份单字码表,格式亦如下):

{编码1:[[词条1],[词条2],[词条3],[词条4],[词条5]]

编码2:[[词条1],[词条2],[词条3],[词条4],[词条5]]

编码3:[[词条1],[词条2],[词条3],[词条4],[词条5]]

……}

第二步、根据状态映射基础按键「a-z」并连成字符串进行提词操作,另外像backspace(退格)、shift切换状态等基础按键都得映射完成。提词完成后进行后处理操作(比如匹配辅助码、逐码提示在候选框注解栏进行填充操作,码表方式所限「逐码提示」可以采用分页的方式进行分步提取加载,翻多少页根据a-z的顺序提多少以减小脚本处理的压力)。

第三步、根据词典格式要求进行绘制候选框,如果直接调用小狼毫的配色参数,需要构建一个复杂的候选窗口。各种参数相互独立才能完美调用。这个可以根据自己的需求进行定制!

第四步、获取窗口光标坐标位置后如果能正常显示候选窗口且能完成提词操作,再定义并映射选词按键、选词上屏后的清屏操作等细节。如此一个基础的输入法雏形就完成了,剩下的只剩添砖加瓦,各种小需求向里面添加。

用户词支持输出特殊符号

候选框显示支持多行对齐

拼音反查编码:

词条转化为图片上屏模式慢图展示:

篇末奉上打包的源码供大家参考,看起来眼花缭乱自己去捋一捋其实实现并不复杂!

下载链接:

https://wwt.lanzoul.com/b07nsqrli 密码:DADA

给TA捐赠
共{{data.count}}人
人已捐赠
AHKV1代码示例社区推荐

更改指定程序托盘图标示例

2022-5-23 9:11:03

AHKV1工具社区推荐

FindText 深度教程 v1.2

2022-5-23 21:10:48

6 条回复 A文章作者 M管理员
  1. 1河许人

    极速构建一个输出热字符串输出的形码输入法,这个名字有点看不懂

  2. 1河许人

    看起来很不错!希望能及时更新!

  3. 1河许人
    1河许人给您打赏了¥5
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索