Win32编程中的中文输入法

【文本编辑器兼容输入法】

文本编辑器只处理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-
   ProfileNotifySink

输入法被选择。

ITfThreadFocusSink

线程获取或者失去焦点

ITfFunctionProvider

用于枚举提供的函数对象。

ITfFnGetPreferredTouch-
   KeyboardLayout

用于选择输入法所要使用的虚拟键盘的布局。

ITfTextEditSink

支持实现包含读写权限的编辑Session。

发布了29 篇原创文章 · 获赞 1 · 访问量 3408

猜你喜欢

转载自blog.csdn.net/defrag257/article/details/103228971
今日推荐