【一起学习输入法】华宇拼音输入法开源版本解析(5)

          原创:good02xaut(CSDN)

  1. IME输入法系统框架

输入法在DOS时代就有了,首先出现的是英文输入法,其次根据市场需要推出中文输入法。微软推出windows操作系统后,输入法先是以IME架构形式,现在又推出更新的TSF技术来支持平板电脑和更高版本的Windows操作系统。

输入法程序也是一个进程,但是我们在任务管理器中却找不到该进程,找到输入法的安装目录会发现一个后缀是.ime的文件,就是一个dll的模块,当一个进程打开输入法要输入汉字的时候其实是加载了这个模块。

默认情况下,IME提供了一个IME窗口(其实是4个窗口,下文有详细展开),通过这个窗口,用户可以用键盘输入并且查看和选择想要的字符。应用程序可以使用输入法管理器(IMM)函数和消息来创建并且管理其自己的IME窗口(比如QQ里是五笔而Word里却是拼音),并使用IME的转换功能提供一个自定义接口(比如,英文输入法到中文输入法的转换)。

输入法管理器IMM只在东亚(中国,日本,韩国)本地化的Windows中才可用。在这些系统中,以SM_DBCSENABLED消息调用GetSystemMetrics函数来确定IMM是否可用。注意,Windows所有本地化版本中都提供了全功能的IME支持,然而仅在安装了亚洲语言包的时候IMM才可用。一个IME-enabled(IME可用)的程序会以SM_IMMENABLED调用GetSystemMetrics函数来确定IMM是否可用。

IME的用户界面主要包含状态窗口、字母组合窗口和列选窗口三个窗口。状态窗口指示出IME处于开启状态并且提供给用户设置转换模式的方法,例如搜狗输入法的状态窗口为“”。字母组合窗口会在用户输入字符的时候出现,其形式基于转换模式(conversion mode转换模式就是输入法,例如拼音转换模式,五笔转换模式等等),同时显示已经输入的字母或者是已经转换了的字符。列选窗口会紧挨着字母组合窗口显示。它包含了一个由“候选条目”构成的列表,此列表匹配选中字符或者是字母组合窗口中的字符。用户可以滚动列选窗口并且选择想要的字符,然后(焦点)返回到字母组合窗口。借此用户可以组合想要的文本直到字符组合成的字符串结束,窗口会关闭。IME将使用WM_IME_CHAR或WM_IME_COMPOSITION/GCS_RESULT消息把列选窗口中组合好的字符发送给窗体中的应用程序。如果应用程序没有处理这些消息,DefWindowProc函数会把它们翻译成一条或多条WM_CHAR消息。

默认情况下,系统会为所有要求输入文本的窗口自动生成并管理状态窗口、字母组合窗口和列选窗口。对于许多程序,这一默认处理已经足够了。这些完全依赖于系统提供IME支持的应用程序称为IME无感知程序(IME-unaware),原因在于它们对系统为管理IME窗口所完成的诸多任务毫无感觉。

相反,一个IME感知程序(IME-aware)会参与IME窗口的创建与管理。例如程序可能通过发送或截取消息并且有目的地对这些(IME)窗口消息进行处理,来控制默认(IME)窗口的选项、位置和外观,例如银行账户的密码输入窗口,会启动自定义输入规则,调整数字键盘的位置等等。有些情况下,这些应用程序会创建它们自己的IME窗口并且对其自定义的状态、字母组合和列选窗口提供完全的控制处理。

“IME窗口类”是一个预定义的系统全局类,它定义了标准IME窗口的外观与行为。在使用CreateWindowEx函数生成窗口时,这个类与普通的控件类很相似。像静态控件一样,IME窗口类自己不响应用户的输入。取而代之,它将用户的输入操作通知给IME并且处理由IME或者应用程序为了响应用户行为而发送给它的控制消息。

IME感知类型的应用程序有时会应用IME类创建自己的IME窗口。这样当程序包含有窗口定位控件时就允许应用程序利用IME窗口的默认数据处理。

当某些能影响IME窗口的事件发生时,系统将向应用程序的窗口过程(window procedure)发送IME窗口消息。例如:当应用程序的窗口(银行账户密码输入文本框)激活时系统将向应用程序WM_IME_SETCONTEXT消息。IME无感知类型的应用程序会把这些消息传递给DefWindowProc 函数,函数会把它们发送给相应的IME窗口。IME感知型的应用程序也会将这些消息或者把这些消息传递给自己的IME窗口。

你可以直接控制IME窗口来执行命令,诸如可以用WM_IME_CONTROL消息来改变字母组合窗口的位置。IME会使用WM_IME_COMPOSITION消息来通知应用程序关于字母组合字符串的变化,或用WM_IME_NOTIFY消息来通知关于IME窗口状态的常规改变。

输入上下文(Input context)是一个内置数据结构,由IME来维护,它包含了IME窗口所使用的有关IME状态的信息。默认情况下,系统会为每一个进程/线程创建并指定一个输入上下文数据结构。在进程/线程中,这个默认的输入上下文是一个共享资源,并且将会与每个新建窗口关联。

要在IME中检索或设置信息,应用程序必须首先获得一个与指定窗口相关联的输入上下文的句柄。你可以通过ImmGetContext函数来获得这个数据结构的句柄。在随后的输入法管理函数调用中,你可以使用这个句柄来检索和设置IME的值,诸如字母组合窗口的风格、字母组合的风格以及状态窗口的位置等。一旦你完成了上下文的使用,你就必须使用ImmReleaseContext函数来释放它,否则其他窗口将无法继续改变IME的设置参数。

因为默认的输入上下文是一个共享资源,你对它的任何改变都将应用于线程中的所有窗口。不过,你可以通过为线程中的一个或多个窗口生成并关联自己的输入上下文的方法来重写默认的行为。不过,你也可以重写默认的行为,方法是为线程中的一个或多个窗口生成并关联自己输入上下文。你对自己的输入上下文所做的改动将仅应用于与其相关的窗口上。

你可以调用ImmCreateContext函数来创建一个新的输入上下文数据结构。然后调用ImmAssociateContext函数要把输入上下文数据结构分配给一个指定的窗口。这个函数将返回一个句柄,这个句柄是先前与窗口关联的输入上下文的句柄。如果先前没有输入上下文与些窗口相关联,函数将返回的句柄将是默认输入上下文(的句柄)。通常,你需要保存默认输入上下文句柄,当你不想再使用自己定义的输入上下文时,再把它与窗口重新关联上,让窗口回复系统默认值即可。

在一个输入上下文与一个窗口关联后,当窗口被激活时并且接受输入焦点时,系统会自动选择那个上下文。输入上下文中的格式(style)和其它信息会影响此窗口随后的键盘输入——决定IME是否和如何操作。

在结束应用程序之前,你必须销毁所有你创建的输入上下文,以防止内存泄露。首先,你必须使用ImmAssociateContext函数从线程中所有与之有关联的窗口上移除输入上下文。然后,ImmDestroyContext函数释放数据结构占用的内存资源。

字母组合字符串(composition string)是指字母组合窗口中的当前文本,即用户键盘输入的字符序列(五笔序列或者拼音序列)。这是将被IME转换为最终字符的输入文本序列。每个字母组合字符串由一个或多个子串组成(clauses),子串是IME能转换成最终字符的最小字符组合。要获取或设置字母组合字符串,调用ImmGetCompositionString 和ImmSetCompositionString函数。例如输入一句话时,字母组合字符串是一句话的所有输入字符内容,而子串则是中间多个词组的输入字符。

当用户在字母组合窗口中输入文本时,IME会跟踪字母组合字符串的状态。这些状态包括属性信息、子串信息、录入信息和子串的位置。你可以通过使用ImmGetCompositionString函数来检索字母组合的状态。

在属性信息数组中,同一个子串中的所有字母都必须具有相同的属性。属性信息是一个由8位值组成的数组,用于确定字母组合字符串中的字符。字符串中的每个字节都对应有一个值,其中,字符串中每个双字节字符的第一和第二字节也都对应的一个值。数组中的每个值,从第0位到第3位可以是下面各值的组合:

Value(值)

Meaning(含意)

ATTR_INPUT

用户输入的字符。它将被IME转换。

ATTR_INPUT_ERROR

字符是一个错误的字符,不能被IME所转换。使用某些辅音字母不能放在一起。

ATTR_TARGET_CONVERTED

被IME所转换了的字符。用户已经选择了这个字符并且IME已经将其转换。

ATTR_CONVERTED

一个已经转换了的字符。IME已经将其转换。

ATTR_TARGET_NOTCONVERTED

正在转换中的字符。用户已经选择了这个字符,但是IME还没有转换它。

ATTR_FIXEDCONVERTED

不能被转换的字符。IME将不能再对其转换。

其它值(大概是指8位中的)将被保留。在日文中,任何拥有ATTR_INPUT属性而不能被转换的字符都是一个平假名、片假名是数字字母。在韩文中,这样的字符是一个韩文字符,它也不能被IME所转换。在传统(也就是繁体)和简体中文中,各个IME(大概是指各个输入法)会以自己的范围内限制它的字符。

子串信息是一个32位值的数组,用于确定子串在字母组合字符串中的位置。每个子串对应一个值,最后一个值确定整个字母组合字符串的长度。数组中的每个值在字节级别上(以字节为单位)确定了子串由字符串算起的偏移量。第一个值总是0,因为第一个子串总是从字符串的起点开始。例如,如果字符串有两个子串,子串消息(数组)就会有三个值:第一个值是0,第二个值是第二个子串的偏移量,第三个值是字符串的长度。对于Unicode,子串的位置是用Unicode字符计算出的位置,并且字符串的长度也是以Unicode字符计数。

录入信息是一个无终结字符(null-terminated character)字符串,代表由键盘输入的字符。光标位置(cursor position)是一个值,它指出光标相对于字母组合字符串中字符的位置。此值是个以字节计算的偏移量,从字符串的起点算起。如果值与字符串的长度相等,光标恰好处在最后一个字符的后面。如果值为-1,意味着没有光标(光标不显示)。对于Unicode,位置和长度都是以Unicode字符来度量的。

你可以使用ImmSetCompositionString函数来设置字母组合字符串或者其中元素的属性。为了确保字母组合窗口已经根据这些改变更新了它的外观显示,函数允许你向窗口发送一个通知消息。设定字母组合字符串状态元素组合的应用程序,默认情况下会把所有对此函数调用中的fNotify参数设置为FASLE,除了最后一个调用,所以对字母组合窗口只会生成一个通知消息。

最后,文本编辑控件还支持两个IME的字母组合字符串处理消息。更多信息,参见EM_GETIMESTATUS 和 EM_SETIMESTATUS。更多有关编辑控件的信息,参见Edit Controls。

备选列表是一个CANDIDATELIST数据结构,这个数据结构由一个列出用户可从中选取字符(例如汉字)或者字符串(例如词)的字符串数组组成。你可以用ImmGetCandidateListCount 和ImmGetCandidateList函数来检索备选列表中的内容。

快捷键(热键)为用户提供了快速改变IME输入状态(例如中/文切换)或选择别的IME(例如从拼音换成五笔)的途径。尽管应用程序不能给系统添加快捷键,但是它可以通过使用ImmSimulateHotKey函数模仿快捷键效果,来启动相同的操作任务。

【一起学习输入法】华宇拼音输入法开源版本解析(5)相关推荐

  1. 【一起学习输入法】华宇拼音输入法开源版本解析(2)

    [一起学习输入法]华宇拼音输入法开源版本解析(2)           原创:good02xaut(CSDN) 键盘的扫描码 薄膜式标准键盘的硬件构成由四部分组成:三层薄膜.104个按键矩阵.3个指示 ...

  2. 【一起学习输入法】华宇拼音输入法开源版本解析(6)

    [一起学习输入法]华宇拼音输入法开源版本解析(6)           原创:good02xaut(CSDN) 输入法运行原理 汉字编码体系 汉字的编码就是汉字对应的字符集,历史上共有5种: GB23 ...

  3. 【一起学习输入法】华宇拼音输入法开源版本解析(3)

    [一起学习输入法]华宇拼音输入法开源版本解析(3)           原创:good02xaut(CSDN) 键盘的虚拟码列表 鼠标虽然不是键盘,为了程序设计方便,依然提供了3个虚拟键码与鼠标上的三 ...

  4. 【一起学习输入法】华宇拼音输入法开源版本解析(8)

    [一起学习输入法]华宇拼音输入法开源版本解析(8)           原创:good02xaut(CSDN) 输入法的码型转换 键盘的拼音输入法 输入法的核心工作是把输入码转换为正确的机内码.拼音输 ...

  5. 【一起学习输入法】华宇拼音输入法开源版本解析(4)

    [一起学习输入法]华宇拼音输入法开源版本解析(4)           原创:good02xaut(CSDN) 键盘的扫描码列表

  6. 【一起学习输入法】华宇拼音输入法开源版本解析(10)

    [一起学习输入法]华宇拼音输入法开源版本解析(10)           原创:good02xaut(CSDN) 硬件框图

  7. 【一起学习输入法】华宇拼音输入法开源版本解析(9)

    [一起学习输入法]华宇拼音输入法开源版本解析(9)           原创:good02xaut(CSDN) 逻辑框图 汉字编码体系和计算机码型转换是汉字输入法的理论基础,无论采用何种设备输入,无论 ...

  8. 输入法半角和全角的快捷转换_华宇拼音输入法 一款完全免费的国产输入法_第1页...

      华宇拼音输入法历史追溯   "华宇拼音输入法"是华宇自主研发的一款文字输入软件,其历史可以追溯到二十多年前.   1999年 华宇拼音输入法初入江湖,前身是李国华博士编写的&q ...

  9. 华宇输入法linux,华宇拼音输入法DEB版能切换为五笔输入法,附操作方法

    原紫光拼音现在叫华宇拼音输入法,DEB版兼容UOS.Deepin.Debian 10.5等操作系统,但是安装完后只有拼音而没有五笔输入法,以下是切换的方法,这样就可以实现拼音和五笔双用途了,随时都可切 ...

  10. 紫光华宇拼音输入法 V6.1 正式版

    紫光华宇拼音输入法 V6.1 正式版 软件名称: 紫光华宇拼音输入法 V6.1 正式版 软件大小: 12.13 MB 软件语言: 简体中文 软件类别: 国产软件/汉字输入 授权方式: 免费软件 应用平 ...

最新文章

  1. Revit和Unreal Engine真实的建筑可视化视频教程
  2. mac android 真机调试
  3. c++ 使用throw抛出异常
  4. QDoc状态status
  5. SAP ABAP实用技巧介绍系列之 ABAP XSLT 使用attribute增加新的属性
  6. python列表去重效率,你应该知道的python列表去重方法
  7. css关于position的几个值
  8. 2、nginx配置文件
  9. Delphi控件的“拿来主义”
  10. SQL SERVER备份脚本
  11. python3.5以及scrapy,selenium,等 安装
  12. python查看系统进程_在Python中获取操作系统的进程信息
  13. Java 线程池 ThreadPoolExecutor源码简析
  14. flask第九篇——url_for【2】
  15. 推荐一款非常好用的截图工具 - SETUNA2,【订】一下就解决了你做数据对照的麻烦
  16. eplan p8详细安装步骤文库_eplan p8详细安装步骤
  17. lilypond 符号_LilyPond演奏优美的音乐
  18. 4K屏配置keil分辨率和图标大小
  19. 金融业务架构的技术挑战
  20. 电脑无法输出4K信号怎么办

热门文章

  1. 网桥(Bridge)作用详解
  2. Java 动态代理机制讲解(Proxy.newProxyInstance)
  3. layui实际项目使用过程中遇到的兼容性问题
  4. 4399曹政:中国互联网的发展逻辑
  5. php postgresql 数组,8.14. 数组 - [ PostgreSQL 手册 ] - 在线原生手册 - php中文网
  6. 计算机基础(01)基础知识
  7. Cdn英文的读音音标_宋sir的美式音标教程 Unit 1 /i/ tea
  8. 打开PDF时显示please wait...怎么办?没有安装pdf阅读器经常出现的提示信息
  9. 使用工具YUMI制作多系统启动盘
  10. 《深入J2SDK》 总结