admin管理员组

文章数量:1630607

准备离职了,在公司做了两年的VC,其中有大半年都是在输入法里面做。也算涉及到了输入法的方方面面,外挂式的,IME式的,还有wince上的sip输入法,也算是八窍通了七窍了。在这里透露一点秘密,秘密一但说穿了就什么都不值了。

做输入法的应该都碰到过这个难题。

安装IME输入法是有API可以调用的 ,但是卸载的时候却没有API调用,只有自已去到注册表里面去查找要删除的输入法的HKL,然后到preload下去删除这个值。BUG就在这里产生了,删除了注册表后,点开语言栏,输入法的图标还在,尽管它已经不能用了。虽然在重启后这个图标就没有了,但是好像还没有谁为了卸载一个输入法去重启系统的。而且在WINDOWS2003下不重启而注销的话,会发现输入法全没有了(应该是WINDOW的一个BUG,XP下不会,其原因是删除的时候preload下的键值没有重排序(如果删除的键值在多个hkl的中间),有一个间断点)。

后来发现极点五笔里面删除不需要重启,看了下,原来是调用了一个uninstallime的小程序,这个小程序是紫光的"迷迷糊糊"做的。于是同事也在我们的输入法里加入了调用uninstallime,但是我始终没有在自已负责的输入法里面加入,因为我相信我自已可以搞定它。

终于在一次项目空闲时有机会来仔细研究一下,试过在删除注册表后使用广播消息,我甚至可以看到语言栏的图标已经重新加载了,但是菜单里的图标却始终删除不了。看来只有从uninstallime入手了。在看了几篇破解的文章之后,试了下,原来破解真的很简单的。uninstallime竟然还是一个加了壳的程序,应该是为了减小体积,脱壳后用ollydebug打开后,发现了一个自已从来没有用过的API,而就是这个API实现了卸载后不用重启可以删除图标。

代码解释实现方法:

 HKEY hkey;
 if(RegOpenKey(HKEY_CURRENT_USER, "Keyboard Layout//Preload", &hkey) == ERROR_SUCCESS)
 {
  BOOL  bret = UnloadKeyboardLayout((HKL)0xe0270804 );
  RegDeleteValue(hkey, "7");
//  ::SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0);
 }
 代码简化了没有做注册表的遍历查找,直接指定了输入法的HKL值和preload下的序号值,很简单的,用UnloadKeyboardLayout删除对应的HKL,然后删除preload下的对应的序号值,操作顺序如果颠倒的话是无效的。

顺便也宣传下自已和同事们花了很大功夫做的输入法——万能拼音,其实功能不比什么搜狗、紫光差,也是智能造句,而且是多码表混和使用(拼音、五笔、笔画)等等,虽然第一版的时候赶工界面基本是抄袭搜狗的,但是现在已经实现了用户自定义,而且64位版的也出了,尽管后来的界面修改和64位我都没怎么看,但是当初的整个程序框架流程也费了很大心,特别是码表的优化调整是最痛苦的过程,不过结果还是值得欣慰的,而且在这个过程中让我更深入的了解了STL。希望它能走的更好。

 谨以此文纪念一下两年的编程生涯,两年没有怎么好好的总结一下,现在离职期间是个好机会。

本文标签: 输入法