Windows CE下中文输入法编辑器

CE包含了一种简体中文输入法编辑器,如果不想编写自己的输入法编辑器,那么可以直接调用默认的。在讲解中文输入法编辑器之前顺便提一下国际化(Internationalization),中文输入法及输入法编辑器只是国际化组件的一小部分。国际化是编写面向不同语言用户的软件过程中一个重要环节,CE的国际化组件包含很多小的组件 。

  下表描述了组件的名称、功能: 名称功能Agfa字体压缩支持字体压缩字体版本因为东亚字体占据内存较大,此组件提供了用于选择不同大小字体文件的选项手写识别手写识别引擎多语言用户界面提供给最终用户用于切换语言种类National Language System国家语言支持(包括日期、时间、数字、货币格式)Transcriber应用程序识别英语、法语、德语的手写识别程序Unicode码支持能够处理和显示Unicode码日语IME日语输入法编辑器韩语IME韩语输入法编辑器简体中文IME简体中文输入法编辑器Shuang Pin IM简体中文双拼输入法GB18030 转换器在GB18030到CE编码之间的转换繁体中文IME繁体中文输入法编辑器

  在定制内核的时候常会遇到这些组件,尤其是字体版本,选择不同的字体对于整个内核的大小影响很大。在定制内核的时候,选择PB提供的字体版本应该参照标题为"Font Versions"的帮助文档,在这个文档中详细的列举了东亚语言字体的文件名称、内容、正常大小和压缩大小。除了选择合适的字体版本外,还应该采用Agfa字体压缩技术,Agfa字体压缩技术的优点是能够减小字体占用的ROM和RAM空间,另外能够保证在压缩和解压缩后数据不丢失。如果采用字体压缩,Agfa压缩技术将字体压缩成TrueType格式,并另存为扩展名为".ac3"的文件,那么CE在使用字体的时候首先寻找扩展名为".ac3"的文件。如果不采用字体压缩,CE将使用非压缩字体,如扩展名为".ttf"".ttc"的文件。下面讲述关于简体中文输入法编辑器的相关知识。

  CE的输入法系统由下列几个部分组成:

  IME(输入法编辑器)内核。包括和用户输入的语言相关的内容,比如输入法、文字库等

  IME界面。包括状态窗口、写作窗口、候选窗口、指南窗口

  IMM(输入法管理器)。负责在CE系统、应用程序、IME之间通信

  输入上下文。包括用户输入状态等

  IME控制窗口。负责发送未处理的IME消息到IME

  输入法系统的工作机制如下:

  当输入法系统启动后,用户按键盘,键盘消息被IMM发送到IME。IME处理消息内容,根据键盘消息的内容或者产生用于写作的字符,或者产生命令。当IME处理键盘消息后,它发送通知消息到当前获得焦点的窗口,如果这个窗口不能处理IME通知消息,那么通知消息被发送到IME控制窗口,控制窗口将消息返回到IME,IME做默认的处理工作(IME提供了完整的用户接口)。对于能够处理IME通知消息的窗口,被称之为IME-aware窗口,相反不能处理IME通知消息的窗口,被成为IME-unaware窗口。能够处理IME通知消息的窗口通过IMM 函数能够实现自定义的输入法编辑器。

  输入上下文:

  输入上下文存储了IME的状态信息,它是IME的内部结构。对于每一个线程,系统创建和分配了一个默认的输入上下文,在线程内的每个窗口都共享输入上下文的内容。具体输入上下文的结构体定义包含在标题为"INPUTCONTEXT"的帮助文档中。从文档中看出,输入上下文包含对应窗口句柄、写作窗口和候选窗口和状态窗口的位置、字体、消息缓冲区等等。用函数ImmGetContext可以得到指定窗口对应的输入上下文的句柄。用ImmReleaseContext释放指定的输入上下文。如果不希望一个线程内的窗口都共享同一个输入上下文,那么可以调用函数ImmCreateContext来创建一个新的上下文,并调用函数ImmAssociateContext将新创建的输入上下文与指定的窗口关联。当不用这个新创建的上下文时,调用ImmDestroyContext来释放内存。调用函数ImmLockIMC能够得到一个指定的输入上下文的指针,通过这个指针可以访问输入上下文的数据。访问结束后调用函数ImmUnlockIMC,ImmUnlockIMC减少计算锁数量,直到释放句柄。关于输入上下文的例子代码如下:

HIMC hIMC = ImmCreateContext();  ///创建新的上下文
LPINPUTCONTEXT lpIC;
lpIC = ImmLockIMC(hIMC);
....................       ///使用lpIC访问上下文
数据
ImmUnlockIMC(lpIC);
ImmAssociateContext(hWnd, hIMC);  ///与窗口关联
ImmDestroyContext(hIMC);     ///最后释放上下文
下面是调用中文输入法的例子代码:HIMC hIMC = ImmGetContext(hWnd);  ///hWnd为当前窗口句柄
POINT pt;
pt.x = 300;
pt.y = 200;
ImmSetStatusWindowPos(hIMC, &pt);   ///设置状态窗口位置
ImmSetOpenStatus(hIMC, TRUE);    ///打开中文输入法
ImmReleaseContext(hEdit, hIMC);     ///最后释放上下文
  我在开发过程中发现并非所有Imm函数都有效,通过对Pocket IME源码分析后证实了我的发现。但上述的函数都能够实现功能,对于只要能够打开并使用中文输入法的要求还是可以满足的。

////////////////////////////////////////////////////////////////////////////////////

Dim hkb As Long

hkb = GetKeyboardLayout(0) '取得目前Thread的Keyboard Layout

 

 

If ImmIsIME(hkb) = 0 Then '代表不是中文输入

ImmSimulateHotKey hwnd, IME_THOTKEY_IME_NONIME_TOGGLE '模拟按Strl-Space

 

 

End If

Dim hkb As Long

hkb = GetKeyboardLayout(0) '取得目前Thread的Keyboard Layout

 

 

If ImmIsIME(hkb) = 1 Then '代表是中文输入

ImmSimulateHotKey hwnd, IME_THOTKEY_IME_NONIME_TOGGLE '模拟按Strl-Space

 

 

End If

 

IME消息、函数、命令、需要的数据结构、常量

原文地址:http://kisin.blogbus.com/logs/34741858.html

IME消息
  以下列出IME中用到的消息。
WM_IME_CHAR(IME得到了转换结果中的一个字符)
WM_IME_COMPOSITION(IME根据用户击键的情况更改了按键组合状态)
WM_IME_COMPOSITIONFULL(IME检测到按键组合窗口的区域无法继续扩展)
WM_IME_CONTROL(由应用程序直接向IME发出控制请求)
WM_IME_ENDCOMPOSITION(IME完成了对用户击键情况的组合)
WM_IME_KEYDOWN(检测到“键盘上的某键被按下”的动作,同时在消息队列中保留该消息)
WM_IME_KEYUP(检测到“键盘上的某键已弹起”的动作,同时在消息队列中保留该消息)
WM_IME_NOTIFY(IME窗口发生了改变)
WM_IME_REQUEST(通知:IME需要应用程序提供命令和请求信息)
WM_IME_SELECT(操作系统将改变当前IME)
WM_IME_SETCONTEXT(输入焦点转移到了某个窗口上)
WM_IME_STARTCOMPOSITION(IME准备生成转换结果)

IME函数
  本节列出了所有IME函数。
函数
说明
EnumInputContext
由应用程序定义的,提供给ImmEnumInputContext函数用来处理输入环境的一个回调函数。
EnumRegisterWordProc
由应用程序定义的,结合ImmEnumRegisterWord函数一起使用的一个回调函数。
ImmAssociateContext
建立指定输入环境与窗口之间的关联。
ImmAssociateContextEx
更改指定输入环境与窗口(或其子窗口)之间的关联。
ImmConfigureIME
显示指定的输入现场标识符的配置对话框。
ImmCreateContext
创建一个新的输入环境,并为它分配内存和初始化它。
ImmDestroyContext
销毁输入环境并释放和它关联的内存。
ImmDisableIME
关闭一个线程或一个进程中所有线程的IME功能。
ImmDisableTextFrameService
关闭指定线程的文本服务框架(TSF)功能--虽然这里把它列了出来,但建议程序员最好不要使用这个函数。
ImmEnumInputContext
获取指定线程的输入环境。
ImmEnumRegisterWord
列举跟指定读入串、样式和注册串相匹配的注册串。
ImmEscape
对那些不能通过IME API函数来访问的特殊输入法程序提供兼容性支持的一个函数。
ImmGetCandidateList
获取一个候选列表。
ImmGetCandidateListCount
获取候选列表的大小。
ImmGetCandidateWindow
获取有关候选列表窗口的信息。
ImmGetCompositionFont
获取有关当前用来显示按键组合窗口中的字符的逻辑字体的信息。
ImmGetCompositionString
获取有关组合字符串的信息。
ImmGetCompositionWindow
获取有关按键组合窗口的信息。
ImmGetContext
获取与指定窗口相关联的输入环境。
ImmGetConversionList
在不生成任何跟IME有关的消息的情况下,获取输入按键字符组合或输出文字的转换结果列表。
ImmGetConversionStatus
获取当前转换状态。
ImmGetDefaultIMEWnd
获取缺省IME类窗口的句柄。
ImmGetDescription
复制IME的说明信息到指定的缓冲区中。
ImmGetGuideLine
获取出错信息。
ImmGetIMEFileName
获取跟指定输入现场相关联的IME文件名。
ImmGetImeMenuItems
获取注册在指定输入环境的IME菜单上的菜单项。
ImmGetOpenStatus
检测IME是否打开。
ImmGetProperty
获取跟指定输入现场相关联的IME的属性和功能。
ImmGetRegisterWordStyle
获取跟指定输入现场相关联的IME所支持的样式列表。
ImmGetStatusWindowPos
获取状态窗口的位置。
ImmGetVirtualKey
获取跟IME处理的键盘输入消息相关联的初始虚拟键值。
ImmInstallIME
安装一个IME。
ImmIsIME
检测指定的输入现场是否有和它相关的IME。
ImmIsUIMessage
检查IME窗口消息并发送那些消息到特定的窗口。
ImmNotifyIME
通知IME有关输入环境状态已改变的消息。
ImmRegisterWord
注册一个输出文字到跟指定输入现场相关联的IME的字典中去。
ImmReleaseContext
销毁输入环境并解除对跟它相关联的内存的锁定。
ImmSetCandidateWindow
设置有关候选列表窗口的信息。
ImmSetCompositionFont
设置用来显示按键组合窗口中的字符的逻辑字体。
ImmSetCompositionString
设置按键组合字符串的字符内容、属性和子串信息。
ImmSetCompositionWindow
设置按键组合窗口的位置。
ImmSetConversionStatus
设置当前转换状态。
ImmSetOpenStatus
打开或关闭IME功能。
ImmSetStatusWindowPos
设置状态窗口的位置。
ImmSimulateHotKey
在指定的窗口中模拟一个特定的IME热键动作,以触发该窗口相应的响应动作。
ImmUnregisterWord
从跟指定输入环境相关联的IME的字典中注销一个输出文字。

IME命令
  以下列出IME中用到的命令(控制消息)。

IMC_CLOSESTATUSWINDOW(隐藏状态窗口)
IMC_GETCANDIDATEPOS(获取候选窗口的位置)
IMC_GETCOMPOSITIONFONT(获取用来显示按键组合窗口中的文本的逻辑字体)
IMC_GETCOMPOSITIONWINDOW(获取按键组合窗口的位置)
IMC_GETSTATUSWINDOWPOS(获取状态窗口的位置)
IMC_OPENSTATUSWINDOW(显示状态窗口)
IMC_SETCANDIDATEPOS(设置候选窗口的位置)
IMC_SETCOMPOSITIONFONT(设置用来显示按键组合窗口中的文本的逻辑字体)
IMC_SETCOMPOSITIONWINDOW(设置按键组合窗口的样式)
IMC_SETSTATUSWINDOWPOS(设置状态窗口的位置)
IMN_CHANGECANDIDATE(IME通知应用程序:候选窗口中的内容将改变)
IMN_CLOSECANDIDATE(IME通知应用程序:候选窗口将关闭)
IMN_CLOSESTATUSWINDOW(IME通知应用程序:状态窗口将关闭)
IMN_GUIDELINE(IME通知应用程序:将显示一条出错或其他信息)
IMN_OPENCANDIDATE(IME通知应用程序:将打开候选窗口)
IMN_OPENSTATUSWINDOW(IME通知应用程序:将创建状态窗口)
IMN_SETCANDIDATEPOS(IME通知应用程序:已结束候选处理同时将移动候选窗口)
IMN_SETCOMPOSITIONFONT(IME通知应用程序:输入内容的字体已更改)
IMN_SETCOMPOSITIONWINDOW(IME通知应用程序:按键组合窗口的样式或位置已更改)
IMN_SETCONVERSIONMODE(IME通知应用程序:输入内容的转换模式已更改)
IMN_SETOPENSTATUS(IME通知应用程序:输入内容的状态已更改)
IMN_SETSENTENCEMODE(IME通知应用程序:输入内容的语句模式已更改)
IMN_SETSTATUSWINDOWPOS(IME通知应用程序:输入内容中的状态窗口的位置已更改)
IMR_CANDIDATEWINDOW(通知:选定的IME需要应用程序提供有关候选窗口的信息)
IMR_COMPOSITIONFONT(通知:选定的IME需要应用程序提供有关用在按键组合窗口中的字体的信息)
IMR_COMPOSITIONWINDOW(通知:选定的IME需要应用程序提供有关按键组合窗口的信息)
IMR_CONFIRMRECONVERTSTRING(通知:IME需要应用程序更改RECONVERTSTRING结构)
IMR_DOCUMENTFEED(通知:选定的IME需要从应用程序那里取得已转换的字符串)
IMR_QUERYCHARPOSITION(通知:选定的IME需要应用程序提供有关组合字符串中某个字符的位置信息)
IMR_RECONVERTSTRING(通知:选定的IME需要应用程序提供一个用于自动更正的字符串)

IME编程中需要用到的数据结构
  这里列了所有在使用输入法编辑器函数和消息时需要用到的数据结构。
  CANDIDATEFORM(描述候选窗口的位置信息)
  CANDIDATELIST(描述有关候选列表的信息)
  COMPOSITIONFORM(描述按键组合窗口的样式和位置信息)
  IMECHARPOSITION(描述按键组合窗口中的字符的位置信息)
  IMEMENUITEMINFO(描述IME菜单项的信息)
  RECONVERTSTRING(定义用于IME自动更正功能的字符串)
  REGISTERWORD(描述一个要注册的读入信息或文字内容)
  STYLEBUF(描述样式的标识符和名称)

IME常量
  这里列出了所有在使用输入法编辑器函数和消息时需要用到的常量。
  • IME转换模式常量
  • IME按键组合字符串常量
  • IME热键标识常量
  • IME句型模式常量
  • IMMEscape函数常量

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭