北大中文论坛 www.pkucn.com

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
楼主: 路路通

《输入法编程漫谈》问答

[复制链接]
发表于 2011-11-8 02:17:08 | 显示全部楼层
好文章啊...........
发表于 2011-11-8 07:36:21 | 显示全部楼层
确实是宝。
只可惜教授太忙……
发表于 2012-3-8 20:44:26 | 显示全部楼层

离开3年了,今天回到这个帖子里来

这3年当中,主要研究营养素的治病方法。后来就报考营养师。
输入法方面也在进行,主要是建词库。因为市面上收集不到好的词库,特别是大的3字以上词为主的词库。因为这牵涉到编码:3字词库是4码好还是5码好?5字以上词库是否该为6码?这两个问题不解决,很难编程。
3年来,输入法工作是零零星星进行的,加起来大概有半年。
这两个问题终于于上个月解决了。
接下来就要正式进入编程阶段。
可惜路路通不大来了。
首先有个问题:要把Imm.h拷贝到C语言所在的文件夹。可以原处已经有Imm.h了,拷贝就得覆盖。那么是不是原来的不够好呢?我们自己搞输入法,是不是也要搞个Imm.h来覆盖路路通的呢?这个Imm.h是干什么的呢?
发表于 2012-3-9 16:42:58 | 显示全部楼层

回复 408楼 的帖子

放在自己工程源碼目錄裏就中,不要覆蓋VC的。
发表于 2012-3-10 19:59:57 | 显示全部楼层

这一段是对键入的符号进行分类处理:

(路路通的初中阶段的imekey.c中的片段)
        //编码串的长度不为零
        //如果是26个字母,增加到编码串
        if (wVKey >= _T('a') && wVKey <= _T('z'))
        {
                CompStrEdit(wVKey, EDIT_ADD);
                return TRUE;
        }
        //其的它如果是向前翻页键,向前翻页
        else if (wVKey == _T('=') || wVKey == _T('.'))
        {
                ForwardPage();
                return TRUE;
        }
        //其它的如果是向后翻页键,向后翻页
        else if (wVKey == _T('-') || wVKey == _T(','))
        {
                BackwardPage();
                return TRUE;
        }
        //其它的如果是数字选择键,选择汉字串
        else if (wVKey >= _T('1') && wVKey <= _T('8'))
        {
                SelectCand(wVKey);
                return TRUE;
        }
        //其它的如果是标点符号键,
        else
        {       
        }

可是找不到对空格的处理。
我运行了一下路路通的天下无敌输入法,看出他对空格的处理等同于打“1”。
可是在他的这段程序中没有对空格的处理。可能是在别的地方处理的。很可能事先把空格改为1了。
发表于 2012-3-10 23:47:36 | 显示全部楼层

找到了:在同一份文件中的BOOL FunKeyHandlerNormal函数中:

对删除键、回车键、空格键、移动键等等的处理。
发表于 2012-3-16 23:01:02 | 显示全部楼层

8天过去了,查到路路通说过更换imm.h的原因是原版本太低

原帖由 帅菜 于 2012-3-8 20:44 发表
这3年当中,主要研究营养素的治病方法。后来就报考营养师。
输入法方面也在进行,主要是建词库。因为市面上收集不到好的词库,特别是大的3字以上词为主的词库。因为这牵涉到编码:3字词库是4码好还是5码好?5字以上 ...

今天好好把这个帖子从头看一遍,看到路路通09年5月27日在343楼说:“记得将VC6的IMM.h替换掉,原有的那个版本太低。”
我的一个疑团解决了
发表于 2012-3-17 23:41:33 | 显示全部楼层
路路通很少来了。学习起来很艰难。
今天知道了什么叫“输入上下文”:这是一个结构,每个线程有一个结构变量INPUTCONTEXT。由“输入”和“上下文”两个单词组成。它有17个成员,其中5个是HIMCC类型的。HIMCC在IMM.H中定义是DWORD。其中一个HIMCC成员叫HIMCC hMsgBuf,用于存放输入的汉字消息(4字节放不下,可能是内存块的句柄或尺寸)。
格式: [消息1] [wParam1][lParam1] [消息2] [wParam2] [lParam2]……这大概就是函数GenerateMessage中调用ImmReSizeIMCC时,第2个参数要乘以3的原因吧?

[ 本帖最后由 帅菜 于 2012-3-17 23:59 编辑 ]
发表于 2012-3-21 22:35:44 | 显示全部楼层
今天终于理解到:送给应用程序的字符串,不是放在结构INPUTCONTEXT所指定的缓冲区中,而是放在结构COMPOSITIONSTR所指定的缓冲区之中。前者只能收取“包裹通知单”,后者才是领包裹的“邮局”
发表于 2013-4-15 15:09:00 | 显示全部楼层
帅菜 发表于 2012-3-21 22:35
今天终于理解到:送给应用程序的字符串,不是放在结构INPUTCONTEXT所指定的缓冲区中,而是放在结构COMPOSIT ...

您好,请问您现在还在弄输入法吗
发表于 2013-4-16 20:22:29 | 显示全部楼层
Stage_I 发表于 2013-4-15 15:09
您好,请问您现在还在弄输入法吗

是。。。。。。。
发表于 2013-4-19 11:07:42 | 显示全部楼层
帅菜 发表于 2013-4-16 20:22
是。。。。。。。

您好,我也是输入法爱好者,若您看到的话恳请您加我一下QQ:273497754,我有些问题想向您请教,谢谢
发表于 2014-3-3 20:42:17 | 显示全部楼层
大吉大利 大家便更衣复入园来
发表于 2014-3-4 16:36:29 | 显示全部楼层
路路通
在这里最后的教导


黄金会员



这段时间忙于开发产品
http://www.mzhkj.com
发表于 2014-5-4 04:55:36 | 显示全部楼层
路路通大师呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大中文系 ( 京ICP备12040209号

GMT+8, 2016-3-24 20:31 , Processed in 0.125476 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表