由于对五笔编码的热爱, 同时又对现有的输入法软件不大满意, 所以一直都是用自己精心维护的一套超低重码词库并用imegen来生成五笔输入法, 但这个生成器在win7以上的系统阵亡了… 想想自己掌握的Trie树刚好就是这种定长编码的最佳数据结构, 于是就抽空从零开始查了下微软最早期的DDK文档以及后来发布的IME sample, 然后用IME写了个五笔输入法, 终于彻底摆脱imegen这个输入法生成器, 对于32位和64位程序中长期困扰我的bug这下总算自己能掌控和改进了,  初步有了五笔和拼音混合输入功能,  编码查询,  重码字词优先级等等功能,  后来还加上了简入繁出这个功能, 此功能还有一段历史: 话说当年Alin玩台服 Tera 这款游戏的时候, 在公共屏道上聊天时用了简体字所以被台湾玩家抗议了-.-! (原来台湾玩家称我们大陆用的简体字为残体字, 他们用的繁体字为正体字), 所以赶紧下线为输入法加上了简入繁出功能—也就是输入的时候用简体编码而且候选窗口中显示的也是简体字词, 但最终打出来的是繁体字词.  其实现非常简单,  也不用维护繁体字词库,  只需要用一个API转换就行了, 下面分享我的输入法实现:

其中 pSrcStr 是存放简体字词的缓冲区,  szFinalResultStrBuf 是最终输出的繁体字词缓冲区

  // For TERA Taiwan !
  WORD wLanguageID = MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED);   
  LCID Locale = MAKELCID(wLanguageID, SORT_CHINESE_PRCP);  
  int iRet = LCMapString(Locale, LCMAP_TRADITIONAL_CHINESE, pSrcStr, -1, 
                         szFinalResultStrBuf, sizeof(szFinalResultStrBuf));  
  if(iRet == 0) 
  {
     // failed, simply copy it
     lstrcpy(szFinalResultStrBuf, pSrcStr); 
  }

IME一些基本注意事项:
*  一个线程不应当访问由另一个线程创建的输入上下文。
*  一个线程不应当将输入上下文与另一个线程创建的窗口相关联,反之亦然。

 

IME
2009-01-03 Comments

Leave a Reply

Your email address will not be published. Required fields are marked *