本文拟结合作者的亲躯体验简要介绍一下在Windows环境下如何编写输入法程序 一直想写一点关于输入法编程的东西,今天终于有点时刻,希望对后来者有点帮忙。在此要专门感激“自由拼音”的作者李振春,我刚开始的几个问题都是在他的帮忙下才解决。 第一咱们需要明白输入法是什么东西。目前经常使用的输入法大体上有两种类型:外挂式(如初期的全能五笔)及输入法接口式(Input Method Editor-IME)。外挂式比较简单,确实是一个exe文件,通过模拟一些Windows输入消息来给当前处于活动状态的编辑窗口输入文字,一个显著的优势是输入法只要启动一次,就能够够在所有进程中利用;但缺点不不容轻忽,第一实现起来也不容易,一个更大的不足是兼容性不够好,通常一个Windows版本需要一人对应的输入法版本,另外这种输入法为了能够截获用户输入,通常需要挂接键盘钩子,容易造成系统不稳固或效率不高。大部份的输入法仍是采纳 IME来实现,下面本文要紧讨论一下IME编程需要注意的问题及解决方法。 IME是什么?IME是在 Windows平台上利用的标准的输入法接口标准。它实质是一个DLL,Windows为那个DLL概念一系列的接口,不同的接话柄现指定的功能。程序员在编写输入法程序时只需要实现这些接口并导出就能够够作为输入法利用。关于具体接口的概念不是本文的重点,若是您需要了解只需要在网络中搜索“输入法编程指 南”就能够够明白 ,更多信息参考MSDN。 刚开始输入法编程最棘手的问题一般是程序框架搭好了却不明白如何利用及调试。那个地址涉及到一个很重要的问题确实是输入法的安装。输入法确实是Windows的一个插件,需要先进行注册,Windows才能识别并利用。为此您需 要先将您生成的DLL复制到系统目录(Windows\System32)再挪用API ImmInstallIME就能够够实现了,在我的实践中是先编一个简单的程序来做安装工作,在每次输入法从头编译完成以后挪用一次以完成输入法的注册。那个地址还有一个需要注意的问题是:Windows提供了一种机制,它许诺输入法程序一旦启动就就再也不退出,这就意味着若是你的程序代码通过修改需要从头安装时将不能不从头启动电脑。在IME概念的接口中有一个接口是提供IME的初始化的,它确实是BOOL WINAPI ImeInquire(LPIMEINFO lpIMEInfo,LPTSTR lpszUIClass,LPCTSTR lpszOption),下面的代码来自我写的输入法: BOOL WINAPI ImeInquire(LPIMEINFO lpIMEInfo,LPTSTR lpszUIClass,LPCTSTR lpszOption) { lpIMEInfo->dwPrivateDataSize = sizeof(CONTEXTPRIV);//系统根据它为INPUTCONTEXT.hPrivate分配空间 lpIMEInfo->fdwProperty = IME_PROP_KBD_CHAR_FIRST | #ifdef _UNICODE IME_PROP_UNICODE | #endif IME_PROP_SPECIAL_UI | IME_PROP_END_UNLOAD ; lpIMEInfo->fdwConversionCaps = IME_CMODE_FULLSHAPE | IME_CMODE_NATIVE; lpIMEInfo->fdwSentenceCaps = IME_SMODE_NONE; lpIMEInfo->fdwUICaps = UI_CAP_2700; lpIMEInfo->fdwSCSCaps = 0; lpIMEInfo->fdwSelectCaps = SELECT_CAP_CONVERSION; _tcscpy(lpszUIClass,CLSNAME_UI); return TRUE; } lpIMEInfo->fdwProperty告知Windows系统您编写的输入法的一些特点,注意一下IME_PROP_END_UNLOAD 那个标志,有了它您编写的输入法会随着启动您的输入法的应用程序(如NotePad)的退出而退出,不然它将长驻于系统中,这也是什么缘故很多输入法在升级安装时需要第一从头启动电脑的缘故。 在那个接口中还有一点需要专门注意,那确实是lpIMEInfo->dwPrivateDataSize,至少我是通过很多次测试才大体证明Windows依照该值为INPUTCONTEXT.hPrivate分派空间。另外若是您修改了那个接口,依照我个人的体会是需要从头挪用ImmInstallIME来安装。 在安装完成后,在输入法列表中应该已经有了您自己的输入法。点击调试,由于它是一个DLL,您需要先选择一个宿主程序,一样选择“记事本”,以调试方式启动“记事本”后,在那个“记事本”中打开您的输入法,您就能够够在源代码中 设置断点了。需要说明的是,VC6.0调试DLL不太好用,第一需要打上SP5或SP6,如此也不能够在DLL启动的时候就设置断点,推荐利用.net来调试。 输入法上下文(HIMC):HIMC是什么?在输入法编程时必然要接触到输入法上下文那个术语,刚接触时听起来实在是半懂不懂。由于输入法是一个插件,它需要和挪用它的应用程序通信,在输入法中生成的编码及重码信息保留在哪里应用程序才能正确的读取呢?答案就在于输入法上下文。输入法上下文是由User.exe(一个系统进程)为应用程序分派的内存句柄,在应用程序中启动的输入法在这块内存中写入数据,User.exe再将数据传递到应用程序。 UIWnd:在IME中需要导出一个接口,原型如 LRESULT WINAPI UIWndProc(HWND hUIWnd, UINT message,WPARAM wParam, LPARAM lParam),hUIWnd是由User.exe传过来的窗口句柄,它是输入法中创建的窗口如编码窗口,重码窗口,状态栏窗口的宿主(Owner),初学输入法编程的人可能会问那个窗口显示在哪里呢?其实它并非是一个一般的窗口,它只是一个用来传递Windows消息的窗口(Message Only),在利历时,您不需要关切它在哪里,只需要利用它就好了。 一个IME需要导出19个(Win98版本)接口,可是关于一个只需要实现一样意义的文字输入的软件,您只需要实现几个大体的接口就能够够让输入法正常工作了。下面一一介绍一下这几个接口。 本文来源:https://www.wddqw.com/doc/e7c926da0266f5335a8102d276a20029bc646356.html