You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<h2id="TL-DR"><ahref="#TL-DR" class="headerlink" title="TL;DR"></a>TL;DR</h2><p>微软真是坑爹不允许在 UWP 里用共享内存结果小狼毫就挂了,改成用 Windows 的 <code>named pipe</code> 来做跨进程交互后就可以用了。</p>
74
+
<h2id="缘由"><ahref="#缘由" class="headerlink" title="缘由"></a>缘由</h2><p>重新捡起五笔后,一直苦恼没有一个合用的五笔输入法。身为半个初学者,很看中的一个功能就是五笔反查——总不能每个不会的字都专门打开一个反查工具;而 Windows 自带的五笔只有一个并不好用的五笔拼音混输功能。各种老牌的五笔输入法要么面界太丑要么久不更新,更有甚者会摆出一幅流氓作派。</p>
<p>但是现在要在 Windows 下使用 RIME 却有了个当初没有的新问题——兼容性。作为第一批 Windows 10 用户,无疑需要一个能够在 UWP 应用下正常使用的输入法。但是 RIME 最初的 Windows 前端「小狼毫」却对从 Windows 8 开始的 Metro 应用——包括 Windows 10 的 UWP 都不兼容。原作者也因为无暇分身而<ahref="https://github.com/rime/home/issues/25" target="_blank" rel="external">放弃了「小狼毫」的维护</a>;其它开发者实现的其它前端又存在各种不稳定的问题——比如 RIME 吧的用户将 RIME 移植到了一个叫作 <ahref="https://github.com/EasyIME/PIME" target="_blank" rel="external">PIME</a> 的输入法框架下,这个框架的界面实现非常的搓,除此之外它的输入服务实现也很蛋疼,经常崩溃,也没有可靠的异常处理,很多时候需要手动重启输入服务。</p>
77
+
<p>开源界的一大准则就是「你行你上」和「show me the code」。当年使用小狼毫的时候没有经历过什么异常崩溃,说明它在这方面的设计是十分优秀的;现在的主要问题也就是不兼容 Metro 应用而已。既然现在自己有了开发能力,不如自已维护一下,方便自己,也方便他人。</p>
78
+
<aid="more"></a>
79
+
<h2id="Text-Services-Framework"><ahref="#Text-Services-Framework" class="headerlink" title="Text Services Framework"></a>Text Services Framework</h2><p>说是决定自己维护,一开始心里也是没什么底的,毕竟自己没有接触过 Windows 开发那一套,也不知道「小狼毫」的兼容性问题究竟出在哪。</p>
80
+
<p>把源码 clone 下来后,一边翻 MSDN 一边浏览代码,基本摸清了 Windows 下输入法的原理。</p>
81
+
<p>现在的 Windows 下的输入法一般有两种实现方式—— Input Method Editor 和 Text Services Framework,都是 Windows 提供给输入法应用的接口。前者算是传统方法,功能强大,但是在 Metro 应用中禁用。后者算是现在的「正统」方法,在现在的 Windows 系统中通用。(什么,Windows XP?那是什么?)</p>
82
+
<p>小狼毫输入法在这方面并没有什么毛病——它同时实现了两种方法(膜一下公子)。不过既然我是想要兼容 Metro,那么就懒得管 IME 实现了。</p>
83
+
<p>所谓 TSF(Text Services Framework),说白了就是 Windows 以 COM 形式(又是微软特色)提供的一套 interface,实现了 interface 要求的 methods 后就可以实现一般意义上的输入法的各种功能。</p>
<p>TSF 输入法是作为 DLL 注入进程中的,那么这个进程如果受了什么限制,输入法也会同样受限。而从 Windows 8 开始引入的 Windows Store App,或者叫作 Metro 应用,或者在 Windows 10 里叫 UWP,它们的进程统统是运行在一个叫 Windows Runtime 的特殊运行时里的。由于微软对 Metro APP 的定位(安全性和受限),在 Windows Runtime 里有一大堆事情不能干。小狼毫肯定是在 TSF 中试图调用 Windows Runtime 不允许的 API 导致了崩溃。</p>
0 commit comments