Windows输入法管理器

这篇文章参考了Input Method Manager。

Windows输入法管理器_第1张图片

从输入法的角度来讲,应用程序可以分为IME-aware和IME-unaware两类。

IMM是使应用程序和IME进行通信的一种技术。它以服务的方式运行。

IME允许用户使用标准键盘输入复杂的字符和符号,不如输入中文、韩文和日文等。

IME监控用户的击键,预测用户期望的输入,提供候选词以供选择。

IMM只有在中国、韩国和日本本地化环境中有效。

1、候选词类表(Candidate List)

候选词类表是还有字符和字符串的数组。要获得相关信息可以调用ImmGetCandidateListCount和ImmGetCandidateList两个方法。

2、编码字符串(Composition String)

当用户在Composition Window中键入文本时,IME追踪Composition String的属性、Clause、击键和光标位置信息。每个Clause中的所有字符必须具有相同的属性。

属性数组为字符串中的每个字节对应一个值。数组中的每一个值的第0~3位可以是一下值的一个组合。

1 ATTR_INPUT 用户键入的字符。IME还没有转换该字符。
2 ATTR_INPUT_ERROR IME不能转换的字符。例IME不能把一些辅音放到一起。
3 ATTR_TARGET_CONVERTED 用户选择并被IME转换的字符。
4 ATTR_CONVERTED IME已经转换的字符。
5 ATTR_TARGET_NOTCONVERTED 用户选择但IME还没有转换的字符。
6 ATTR_FIXEDCONVERTED IME不会转换的字符。

所有其它的值都被保留了。在中文(简体、繁体)、韩文和日文中都有不同的定义。

Clause是一个32-bits值的数组,记录clause在Composition String中的位置。每个clause对应一个偏移量(位置),最后在加上个整串的长度。第一个值总是零。在Unicode下偏移和长度是以字符来计算的。

键入信息表示一个用户键入的非终结(null-terminated)字符串。

光标位置是相对于Composition String开始处的字符的个数。如果值为0,则光标在第一个字符的前面。如果值为字符串的长度,则光标被放到最后一个字符的后面。如果值为1,则光标不显示。在Unicode中位置和长度均以字符个数记。

ImmSetCompositionString函数允许应用程序给Composition Window发送一个消息。通常应用程序在多次调用该函数时会禁用这个消息,而只允许最后一次调用发送该消息。

3、热键(Hot Keys)

热键给用户在同一输入法中快速切换输入模式或在不同输入法间快速切换提供了一种方式。

4、IME消息(IME Messages)

当影响IME窗口的事件发生时,操作系统会给应用程序的窗口过程发送IME窗口消息。如当一个窗口被激活时,操作系统会给应用程序发送WM_IME_SETCONTEXT消息。IME-unaware应用程序会略过这些消息,直接到DefWindowProc,该函数会把它们送到默认的IME窗口。IME-aware应用程序将处理这些消息或者将它们发往自己的IME窗口。

应用程序也可以给IME窗口直接发送消息,如用WM_IME_CONTROL来改变Composition窗口的位置。IME使用WM_IME_COMPOSITION消息来报告应用程序composition string改变了。通过WM_IME_NOTIFY消息来报告IME窗口的状态变化。

5、IME窗口类(IME Window Class)

IME窗口类是一个预定义的系统全局类,定义了标准IME窗口的外观和行为。

IME窗口自己不负责处理用户的输入。IME窗口报告IME用户输入和处理IME与应用程序的控制消息。

6、输入上下文(Input Context)

输入上下文是IMM维护的一个内部结构。它 包含IME的状态信息,并被IME窗口使用。在默认情况下操作系统为每一个线程创建和分配一个输入上下文。在线程中默认的输入上下文是一个共享的资源并和每一个新创建的窗口关联。

要操作IME,应用程序必须获得和指定窗口相关联的输入上下文的句柄。该句柄可以通过ImmGetContext函数得到。通过这个句柄可以调用IMM函数。一旦应用程序用完了输入上下文必须通过ImmReleaseContext函数释放。

因为默认的输入上下文是一个共享的资源,所以任何对它的修改都会影响线程中的所有窗口。当然,应用程序可以创建新的输入上下文替代默认的输入上下文。一个应用特定的输入上下文只会影响和它关联的窗口。

应用程序通过ImmCreateContext创建输入上下文。通过ImmAssociateCOntext来关联窗口和上下文,该函数返回一个指向上一个上下文的句柄。如果没有关联的输入上下文就返回默认的输入上下文。可以通过保存这个句柄,以便在不需要自定义输入上下文时将它重新关联回去。

当窗口和输入上下文关联后,在窗口激活时,操作系统自动选择该上下文并获得焦点。应用程序必须销毁自定义输入上下文。首先通过ImmAssociateContext移掉关联,然后在通过ImmDestroyContext销毁。

7、Status,Composition,Candidates窗口

IME的UI部分由Status窗口、Composition窗口和Candidates窗口组成。

Status窗口表示IME已经打开,允许用户设置转换方式。

Composition窗口在用户键入文本时出现,依据转换方式,显示键入的文本或转换后的文本。

Candidate窗口和Composition窗口组合出现,包含和Composition窗口中选择的字符串对应的后选词。用户可以滚动候选词列表,选择期望的字符串,然后返回Composition窗口。这个过程反复进行直到Composition String结束,并关闭窗口。

IME将拼装好的字符串以WM_IME_CHAR或WM_IME_COMPOSITION消息的形式发给应用程序。如果应用程序不处理这些消息,那么DefWindowProc将这些消息转换成一个或多个WM_CHAR消息。

默认情况下操作系统自动创建和管理Status,Composition和Candidate窗口。对于许多应用程序默认的过程就足够了。这些应用程序完全依赖操作系统对IME的支持,它们被称作IME-unaware应用程序。IME-aware应用程序自己创建和管理IME。

你可能感兴趣的:(输入法)