漫谈WinCE输入法的编写(四)

//========================================================================
//TITLE:
//    漫谈WinCE输入法的编写(四)
//AUTHOR:
//    norains
//DATE:
//    Tuesday  27-March -2007
//Environment:
//        EVC4.0 + Standard SDK
//========================================================================
       
        好的,我们最后来看看编写输入法需要注意的一些细节.


1.如何发送字符       

        如果按之前的文章保存好回调函数,那么发送字符则是非常简单的事情.
       
        例如,我们向应用程序发送一个字符":",只需如此:
       
 m_pIMCallback->SendString(TEXT(""),1);

       
        如果想发送键盘消息,则可以调用这两个个函数:SendCharEvents(),SendVirtualKey();
       
        因为这三个个函数在文档中都有详细介绍,使用也并无多大困难,在此略为不表.
       


2.如何使输入法正常工作

        输入法编写完毕后如果仅仅只是将其包含至系统之后(如何将文件包含到系统请见我之前的文章),并不能让输入法正常工作.如果想要输入法正常运作,尚需要更改注册表.
               
        下面注册表内容举个例子:

[HKEY_CLASSES_ROOTCLSID{42429999-ae04-11d0-a4f8-00aa00a749b9}]
    @
="输入法"
    
"KBMode"=dword:5
[HKEY_CLASSES_ROOTCLSID
{42429999-ae04-11d0-a4f8-00aa00a749b9}DefaultIcon]
    @
="/windows/MyInputMethod.dll,0"
[HKEY_CLASSES_ROOTCLSID
{42429999-ae04-11d0-a4f8-00aa00a749b9}InprocServer32]
    @
="/windows/MyInputMethod.dll"
[HKEY_CLASSES_ROOTCLSID
{42429999-ae04-11d0-a4f8-00aa00a749b9}IsSIPInputMethod]
    @
="1"

   
        我们来看看注册表的具体内容代表的含义:
        {42429999-ae04-11d0-a4f8-00aa00a749b9}:微软唯一识别ID字符,据说可以通过某些软件生成,但我没找到^_^.
        "输入法":在输入法管理器界面中显示的标题.
        "//windows//MyInputMethod.dll":我们编写的输入法的动态链接库名和所处的路径.
       
        一般来说,只要更改以上三项,就能达到个性化输入法的目的.将该注册表键值包含至PB的工程目录,系统生成完毕之后,输入法便可正常运作.
       
       
       
3.如何方便调试输入法

        因为输入法要包含到系统中才能正常运作,所以在一般流程上,应该是在PB中建立输入法工程,然后添加特性,接着是编译系统,最后是下载到目标机中进行调试.即使是改动很小,也需要照此步骤走一遍,麻烦琐屑不说,时间上的浪费也让人烦躁.
       
        如果输入法的编写是按照之前文章所说的结构,那么调试的话则会非常方便.只要将创建的子窗口的代码改为创建主窗口即可:
 
               m_hWnd = CreateWindowEx(0,
                        WINDOW_CLASS,
                        WINDOW_TITLE,
                        WS_POPUP 
| WS_BORDER ,
                        
0,
                        
0,
                        IMG_IMWND_WIDTH,
//rcWnd.right - rcWnd.left,
                        IMG_IMWND_HEIGHT,//rcWnd.bottom - rcWnd.top,
                        NULL,
                        NULL,
                        m_hInst,
                        NULL
                        );

       
        我们所需要做的,就是像普通应用程序一样对创建的窗口进行调试.唯一和输入法管理器调用不同的是,我们无法测试字符的发送.但这点,相对于整个代码来说,仅仅是很小一部分而已;何况,只要留意本章的第一点所提及的关键点,也并不会显得困难了.



4.输入法崩溃的可能原因

        有时候明明代码没有问题,但只要一调用输入法管理器,选择我们所需的输入法,程序就会崩溃.特别是,输入法用到两个类,并且这两个类是互相独立,如果其中一个类调用另一个类的,那么很容易地,就会发生崩溃.
       
        解决方法有其二,之一是:如果有两个以上的类,那么将其它所有的类的声明和定义包含于主类中,相当于主类里再声明子类.好处是大小不会变更,坏处嘛,自然也是显而易见----因为是多个类交杂在一起,显得非常的混乱.

        方法之二,则只要更改编译器选项,让其不优化即可.
       
        如图:

       
        好处是不用更改源代码结构,使得代码清晰明了;坏处是,DLL的体积会有所增加.
posted @ 2007-04-02 23:30  我的一天  阅读(208)  评论(0编辑  收藏  举报