【文本编辑器兼容输入法】
文本编辑器只处理WM_CHAR是不够的,只处理WM_CHAR的话,用户使用输入法输入文本时则会弹出小框框,这样很不好看。最好通过IMM和TSF(高级文字服务)实现中文输入法的输入区域交互行为。
Windows XP开始引入TSF,不过也兼容IMM应用程序。在Windows Vista之前,没有安装东亚语言支持IMM不可用。在Windows 7之前,关闭高级文字服务后TSF会失效。从Windows 7开始,这两个开关都被去掉了,所有的输入法API总是可用的。
对于文本编辑器程序来说,实现TSF比实现IMM复杂很多,因为TSF是基于COM的,而且需要实现的函数也非常多,一般用户想要的也只是不弹小框框,所以如果时间不够的话,可以考虑只实现IMM。IMM是基于窗口消息的,使用起来比较简单。
可以参考Windows SDK中的文档和示例,如果需要离线文档和示例的话,推荐Windows 7 and .NET 3.5 SP1 SDK。对于Windows 7 and .NET 3.5 SP1 SDK,示例源代码的路径:
C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\winui\input\tsf\tsfapps
【TSF输入法的实现】
微软正在逐步删除IMM输入法相关支持,所以如果想编写一个输入法,最好使用TSF架构。TSF输入法的实现,微软Windows SDK给了几个示例,最好研究一下示例。
C:\Program Files\Microsoft SDKs\Windows\v7.0\Samples\winui\input\tsf\textservice
简单来说,TSF输入法就是一个实现了若干接口的COM类。这个COM类需要按照COM组件的方式注册进系统,然后再将这个COM类注册为输入法。输入法一般还要有数字签名。
http://zhhz.suda.edu.cn/ca/60/c3892a51808/page.htm
根据上面的资料,输入法的COM类主要实现以下10个COM接口:
接口 |
说明 |
ITfTextInputProcessorEx |
TSF管理器通过该接口激活或冻结输入法。 |
ITfThreadMgrEventSink |
用于接收线程管理器的事件通知。 |
ITfKeyEventSink |
输入法用来接收和拦截键盘与焦点通知。 |
ITfCompositionSink |
处理输入码编辑被终止的情况。 |
ITfDisplayAttributeProvider |
TSF管理器通过该接口获取独立显示对象 |
ITfActiveLanguage- |
输入法被选择。 |
ITfThreadFocusSink |
线程获取或者失去焦点 |
ITfFunctionProvider |
用于枚举提供的函数对象。 |
ITfFnGetPreferredTouch- |
用于选择输入法所要使用的虚拟键盘的布局。 |
ITfTextEditSink |
支持实现包含读写权限的编辑Session。 |