第二章   Windows9x系统提供的ime管理函数  上一章,我们介绍了ime文件中必须设计的函数,这些函数要靠我们自己来设计。要完成这些函数的设计,需用到windows系统提供的管理函数(Input Method Manager,简称IMM)。    IMM函数可以被IME函数使用,也可用于应用软件直接管理IME。    相关术语:        (1)input method context 简称IMC--输入法相关部分,在这里解释为:相关连的应用程序(进程)        (2)component of the input context   简称IMCC--IMC的部件,是INPUTCONTEXT 结构的成员。一、IME中使用的IMM函数清单           ImmGetCompositionWindow                     //取编码窗口信息ImmSetCompositionWindow                      //设置编码窗口信息 ImmGetCandidateWindow                          //取选择窗口信息 ImmSetCandidateWindow                          //设置选择窗口信息ImmGetCompositionString                         //取编码窗口的某一信息ImmSetCompositionString                         //设置编码窗口的某一信息ImmGetCompositionFont                           //取编码字体ImmSetCompositionFont                           //设置编码字体ImmGetNumCandidateList                         //取选择区中编码数ImmGetCandidateList                                //取选择区中编码ImmGetGuideLine                          ImmGetConversionStatus                          //取当前输入法的状态(ACSII,SHAPE,FULL等)ImmGetConversionList                              //重新获得选择区转换表ImmGetOpenStatus                                   //取输入法打开属性ImmSetConversionStatus                          //设置输入法状态ImmSetOpenStatus                                   //设置输入法打开状态ImmNotifyIME                                           //通报IME,输入法状态被改变         ImmGenerateMessage            //将我们的汉字串法发送到与当前输入法相关联的应用软件中
         ImmRequestMessage              //向应用程序发送WM_IME_REQUEST         ImmLockIMC                              //获取当前IMC的INPUTCONTEXT结构信息,增加IMC 计数器
         ImmUnlockIMC                        //释放IMC计数器
         ImmGetIMCLockCount                //取计数器值
         ImmCreateIMCC                      //创建INPUTCONTEXT结构的一个成员
         ImmDestroyIMCC                   //删除IMC成员缓冲区
         ImmLockIMCC                          //取IMCC缓冲地址,同时使IMCC的计数器值增加
        ImmUnlockIMCC                     //递减IMCC计数器
         ImmReSizeIMCC             //重新设置IMC的成员的缓冲区大小
        ImmGetIMCCSize                  //取IMC成员的缓冲区大小
            ImmGetIMCCLockCount       //返回IMC计数器值
            ImmGetHotKey                       //取输入法状态键,该函数供控制面板使用            ImmSetHotKey                         //设置输入法的热键
            ImmCreateSoftKeyboard          //产生一个软键盘
            ImmDestroySoftKeyboard      //销毁软键盘
            ImmShowSoftKeyboard      //显示或隐藏软键盘
二、IMM函数使用格式说明1、BOOL WINAPI ImmGenerateMessage(            //将我们的汉字串法发送到与当前输入法相关联的应用软件中
        HIMC hIMC                                                    //与当前输入法相关联的应用软件的句柄,                                           //该结构的hMsgBuf项即为汉字串消息
        )     成功为TRUE,否则为FALSE2、LRESULT WINAPI  ImmRequestMessage(      //向应用程序发送WM_IME_REQUEST                                                                               //只是用于w98及w2000
            HIMC hIMC,                                                 //与当前输入法相关联的应用软件的句柄
            WPARAM wParam,                                       //与WM_IME_REQUEST相关的wP
            LPARAM lParam                                          //与WM_IME_REQUEST相关的LP                                                                              //=IMR_COMPOSITIONWINOW                                                                               //=IMR_CANDIDATEWINDOW                                                                               //=IMR_COMPOSITIONFONT                                                                                //=IMR_RECONVERTSTRING                                                                                //=IMR_CONFIRMRECONVERTSTRING                                                                                //=IMR_QUERYCHARPOSITION                                                                                //=IMR_DOCUMENTFEED
        )3、LPINPUTCONTEXT  WINAPI ImmLockIMC(     //获取当前IMC的INPUTCONTEXT结构信息,增加IMC 计数器
            HIMC hIMC                                                   //当前应用程序句柄
            )        成功返回INPUTCONTEXT 结构指针,否则为NULL4、BOOL WINAPI ImmUnlockIMC(    //释放IMC计数器
            HIMC hIMC                                  //当前应用程序句柄
            )         返回:如果IMC计数器被减少到0了,返回FALSE,否则为TRUE.   注意:ImmLockIMC与ImmUnlockIMC必须成对出现,必须是相同的HIMC5、HIMCC WINAPI ImmGetIMCLockCount(        //取计数器值
            HIMC hIMC                                                 //当前应用程序句柄
        )       如果成功返回HIMC的计数器值,否则为NULL.6、HIMCC WINAPI ImmCreateIMCC(              //创建INPUTCONTEXT结构的一个成员
            DWORD dwSize                                      //成员的缓冲区长度
        )   如果成功返回IMC的成员句柄,否则为NULL7、HIMCC WINAPI ImmDestroyIMCC(           //删除IMC成员缓冲区
            HIMCC hIMCC                                       //被删除的IMC的成员
        )如果成功返回NULL,否则等于该HIMCC.8、LPVOID WINAPI  ImmLockIMCC(      //取IMCC缓冲地址,同时使IMCC的计数器值增加
            HIMCC hIMCC                                 //IMC成员句柄
        )If the function is successful, the return value is the pointer for the IMC component. Otherwise, the return value is NULL.

解决方案 »

  1.   


    9、BOOL WINAPI ImmUnlockIMCC(      //递减IMCC计数器
                HIMCC hIMCC                                //IMC成员句柄
            )      如果IMCC的计数器值为零,则返回 FALSE,否则为TRUE.10、HIMCC WINAPI ImmReSizeIMCC( //重新设置IMC的成员的缓冲区大小
                HIMCC hIMCC,                                   //IMC的成员句柄
                DWORD dwSize                                 //新缓冲区大小
            )        如果成功,返回新的HIMCC,否则为 NULL.11、DWORD WINAPI ImmGetIMCCSize(       //取IMC成员的缓冲区大小
                    HIMCC hIMCC                                     //IMC成员句柄
                )           返回IMC成员的缓冲区大小12、DWORD WINAPI ImmGetIMCCLockCount(   //返回IMC计数器值
                    HIMCC hIMCC                                           //IMC成员的句柄
                )        成功返回该IMCC的计数器值,否则为013、BOOL WINAPI ImmGetHotKey(           //取输入法状态键,该函数供控制面板使用   
                    DWORD dwHotKeyID,
                    LPUINT lpuModifiers,
                    LPUINT lpuVKey,
                    LPHKL lphKL
                )14、BOOL WINAPI ImmSetHotKey(    //设置输入法的热键
                    DWORD dwHotKeyID,
                    UINT uModifiers,
                    UINT uVKey,
                    hKL hKL
                )15、HWND WINAPI ImmCreateSoftKeyboard(           //产生一个软键盘
                    UINT uType,                                                     //软件盘上的键码含义的定义方式                                                                              //=SOFTKEYBOARD_TYPE_T1                                                                             //=SOFTKEYBOARD_TYPE_C1
                    UINT hOwner,                                                 //该输入法的UI窗口                               
                    int x,                                                              //定位坐标
                    int y                                                              //定位坐标
                )    成功返回软键盘的窗口句柄16、BOOL WINAPI ImmDestroySoftKeyboard(      //销毁软键盘
                    HWND hSoftKbdWnd                                    //软年盘窗口句柄
                )      成功为TRUE,法哦则为FALSE.17、BOOL WINAPI  ImmShowSoftKeyboard(      //显示或隐藏软键盘
                    HWND hSoftKbdWnd,                                   //软年盘窗口句柄
                    int nCmdShow                                            //窗口状态=SW_HIDE 表示隐藏,=SW_SHOWNOACTIVATE表示显示
                   )如构成功返回 TRUE. 否则为 FALSE.
    --------------------------------------------------------------------------------第一章   Windows9x系统下汉字输入法的基本原理  Windows系统下汉字输入法实际上是将输入的标准ascii字符串按照一定的编码规则转换为汉字或汉字串,进入到目的地。由于应用程序各不相同,用户不可能自己去设计转换程序,因此,汉字输入自然而然落到WINDOWS系统管理中。一、输入法与系统的关系     键盘事件  应用程序       |    |       Windows的USER.EXE         |       输入法管理器         |        输入法   系统的键盘事件有windows的user.exe软件接收后,user.exe在将键盘事件传导输入法管理器(Input Method Manager,简称IMM)中,管理器 再将键盘事件传到输入法中,输入法根据用户编码字典,翻译键盘事件为对应的汉字(或汉字串),然后再反传到user.exe中,user.exe再将翻译后的键盘事件传给当前正运行的应用程序,从而完成汉字的输入。二、汉字输入法的组成    微软Windows9x系统中汉字输入法的名称是"Input Method Editor" ,简称IME,输入法的程序名称为:*.ime,数据文件名称为*.MB,即通常说的输入法编码表(字典).    实际上IME文件是一个动态连接库程序(DLL),它与dll文件没有区别,只是名称不同而已。  一般汉字输入法都由三个窗口组成:    状态窗口(Status Windows)-显示当前的输入法状态(中文还是英文等站环信息);    编码输入窗口(Composition Windows)-显示当前击键情况;    汉字选择窗口(Candidates Windows)-列出当前编码的全部汉字(串),供用户选择或查询。    上述三个窗口由基本的用户接口(User Interface )函数管理着。  现在我们用Dumpbin.exe打开微软提供的拼音输入法(WINDOWS\SYSTEM\WINPY.IME)看看它有什么组成(这里一WINDOWS98为例,并假定windows系统安装在c:盘下):C:\Dumpbin  c:\windows\system\winpy.imeMicrosoft (R) COFF Binary File Dumper Version 6.00.8168
    Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
    Dump of file WINPY.IMEFile Type: DLL       //IME 实际为dll程序Section contains the following exports for WINPY.ime0 characteristics
    34A37323 time date stamp Fri Dec 26 17:04:35 1997
    0.00 version
    1 ordinal base
    19 number of functions             //共有19个函数
    19 number of names     // 对应19个名称 ordinal hint RVA name1 0 0000A010 CandWndProc  //"选择汉字窗口"注册函数
    2 1 0000E750 CompWndProc  //"输入编码窗口"注册函数
    3 2 0000FB50 ImeConfigure  //配置当前ime参数函数 
    4 3 0000FEC0 ImeConversionList//将字符或字符串转换成目标字符
    5 4 0000FFA0 ImeDestroy   //退出当前使用的IME
    6 5 000030D0 ImeEnumRegisterWord 
    7 6 0000FFB0 ImeEscape        //应用软件访问输入法的接口函数.
    8 7 00003080 ImeGetRegisterWordStyle 
    9 8 0000E9A0 ImeInquire      //启动并初始化当前IME输入法
    10 9 0000A800 ImeProcessKey    //IME输入键盘事件管理函数
    11 A 00002C20 ImeRegisterWord      //向输入法字典注册字符串
    12 B 000109A0 ImeSelect                         //启动当前IME输入法
    13 C 000109E0 ImeSetActiveContext   //设置当前的输入处于活动状态.
    14 D 0000C850 ImeSetCompositionString 由应用程序设置输入法编码
    15 E 0000AEE0 ImeToAsciiEx    //将输入的键盘事件转换为汉字编码事件
    16 F 00002F40 ImeUnregisterWord   //删除被注册的字符串.
    17 10 0000CA90 NotifyIME   //IME事件管理函数
    18 11 00005160 StatusWndProc //状态窗口注册函数
    19 12 00002350 UIWndProc   //用户界面接口函数Summary5000 .ShareDa
    7000 .data
    2000 .idata
    1000 .rdata
    3000 .reloc
    5000 .rsrc
    2000 .sgroup
    18000 .text
        从上述可以看出,IME程序共有19个出口函数组成,每一个函数都有特定的格式,它们担负着与windows 系统传递信息的作用,这些函数是供Windows系统调用的。