微软新一代输入法框架 TSF - Text Service Framework 小小的研究

简介: 原文:微软新一代输入法框架 TSF - Text Service Framework 小小的研究 虽说是转载的,但是其中,有很多我自己的评论,我会用红色的字标出来,参考的博文有: TSF架构:http://blog.
原文: 微软新一代输入法框架 TSF - Text Service Framework 小小的研究

虽说是转载的,但是其中,有很多我自己的评论,我会用红色的字标出来,参考的博文有:


TSF架构:http://blog.csdn.net/mspinyin/article/details/6137709

下面内容来自第一篇被引用的文章,TSF架构:


几个关于TSF的术语


TIP (Text Input Processor), a Text service in TSF

Cicero,TSF的开发代号,所以微软内部通常称呼TSF框架为Cicero

CUAS (Cicero Unaware Application Support),为所有应用程序和控件提供基本的TIP支持

AIMM(Active Input Method Manager),和CUAS一起工作


输入法框架


先讲一点点历史,Windows提供了两套输入法框架: Windows XP及之前,是IMM (Input Method Manager),基于纯函数API的。目前市面上非微软中文输入法基本上都是只实现IMM框架。

Windows XP开始及以后,Windows提供新的输入框架TSF,是基于COM的。实际上,到了Windows Vista,Windows 7,所有的应用程序和各种输入控件都是优先使用TSF的实现。但之所以Windows Vista,Windows 7用户还能使用各种基于IMM的输入法,是因为Windows提供了一个组件来将所有TSF的请求转为IMM的API。(PunCha:难道Win8开始就不提供了吗?!很有可能,因为Win8下很多Imm的函数都不能使用了)

按照微软的说法,TSF会最终取代IMM框架。而微软拼音基于兼容,功能和性能方面的原因,将这两个框架都实现了。(PunCha:Win8下,只有你们一家还能用Imm的API,很厚道!)

下面主要介绍TSF框架的输入法及与应用程序的交互。


TSF框架


Cicero它的目标是提供一套简单通用并易扩展的框架,用于高级文本输入和自然语言处理。一个TSF text service能够提供多语言支持和处理:键盘输入(我们通常讲的输入法),手写识别,语言识别等。


TSF的构架图

从上面构架图可以看到,TSF提供一个位于应用和输入法实现的间接层(一个Text service/TIP可以是一个输入法,或语音识别,PunCha:记住,TIP就是一个输入法提供的一个服务,比如百度输入法提供“语音、手写、键盘”输入,那就是3个Tip,但是一般我们都是用键盘输入,所以可以简单认为Tip是一种输入法。)。所以,TSF的优点在于,它是一个设备无关,语言中立,可扩展的系统;同时给用户提供一致的输入体验。任何TSF-enabled应用程序都能从任何text service接受文字输入,而不用考虑Text source的具体细节。同时,Text service也不用考虑各种不同应用的差别。譬如下面的应用场景:

 

上图可以看出, 应用程序收到”The boy ate the red apple”这段文字, 但是它不知道这些字是哪个TIP输入的,有可能是”Keyboard TIP”, 或是”Speech TIP”等。


与应用程序的交互


那么,这个框架是如何工作的?看看下面的组件交互图

在windows XP下,默认是CUAS关闭的,其交互如下


 

从上图可见,所有“edit control”(包括Notepad)都是直接调用IMM的API,最后调用IMM输入法,而4.1版本后的“RichEdit control”(包括WordPad等)是直接用TSF实现的输入法)

(PunCha:注意,是TSF依赖于Imm)

在Windows XP下如果打开CUAS,或者在Windows Vista和Windows 7下,则如下交互:


可以看到,IMM32和CUAS中多了一条交互,这意味着如果一个输入法实现了TIP,在Windows Vista和Windows 7,或CUAS打开的Windows XP下,应用程序的所有输入由TIP实现完成。

(PunCha:注意,Imm依赖于CUAS了!即可以使用用TSF实现的输入法了,应该就是高级输入)


下面内容来自第二篇被引用的文章的一条注释,使用TSF COM API获得输入法信息:

#include 
#include 

int _tmain(int argc, TCHAR* argv[])
{
    CoInitialize(0);
    HRESULT hr = S_OK;

    //PunCha:创建Profiles接口被
    ITfInputProcessorProfiles *pProfiles;
    hr = CoCreateInstance(  CLSID_TF_InputProcessorProfiles,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_ITfInputProcessorProfiles,
        (LPVOID*)&pProfiles);

    if(SUCCEEDED(hr))
    {
        IEnumTfLanguageProfiles* pEnumProf = 0;
        //PunCha:枚举所有输入法咯
        hr = pProfiles->EnumLanguageProfiles(0x804, &pEnumProf);
        if (SUCCEEDED(hr) && pEnumProf)
        {
            TF_LANGUAGEPROFILE proArr[2];
            ULONG feOut = 0;
            //PunCha:其实proArr这里应该写成 &proArr[0],因为里面只需要一个TF_LANGUAGEPROFILE变量!而且,proArr[1]都没用到过!
            while (S_OK == pEnumProf->Next(1, proArr, &feOut))
            {
                //PunCha:获取他的名字
                BSTR bstrDest;
                hr = pProfiles->GetLanguageProfileDescription(proArr[0].clsid, 0x804, proArr[0].guidProfile, &bstrDest);
                OutputDebugString(bstrDest);
                wprintf(bstrDest); printf("\n");

                BOOL bEnable = false;
                hr = pProfiles->IsEnabledLanguageProfile(proArr[0].clsid, 0x804, proArr[0].guidProfile, &bEnable);
                if (SUCCEEDED(hr))
                {
                    printf("Enabled %d\n", bEnable);
                }
                SysFreeString(bstrDest);
            }
        }

        pProfiles->Release();
    }

    CoUninitialize();
    return 0;
}






目录
相关文章
|
5月前
|
开发者 监控 开发工具
如何将JSF应用送上云端?揭秘在Google Cloud Platform上部署JSF应用的神秘步骤
【8月更文挑战第31天】本文详细介绍如何在Google Cloud Platform (GCP) 上部署JavaServer Faces (JSF) 应用。首先,确保已准备好JSF应用并通过Maven构建WAR包。接着,使用Google Cloud SDK登录并配置GCP环境。然后,创建`app.yaml`文件以配置Google App Engine,并使用`gcloud app deploy`命令完成部署。最后,通过`gcloud app browse`访问应用,并利用GCP的监控和日志服务进行管理和故障排查。整个过程简单高效,帮助开发者轻松部署和管理JSF应用。
69 0
|
5月前
|
开发者 Java
Play Framework深度解析:依赖注入的神秘力量,如何助力Web应用架构优化?答案即将揭晓!
【8月更文挑战第31天】依赖注入(DI)是现代软件开发的关键技术,用于分离对象创建与依赖关系,提升代码的可维护性和可测试性。Play Framework是一款高性能Java Web框架,内置了基于Google Guice的DI支持。本文探讨Play Framework中DI的最佳实践,包括定义组件、构造函数注入、字段注入以及作用域控制和自定义绑定等高级特性,帮助开发者轻松构建结构清晰、可维护性高的Web应用。
75 0
|
5月前
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
59 0
|
Linux C++ Windows
Notepad--国产开源编辑器,横空出世!
作为一个来自中国的、支持windows/linux/mac、绿色免费的、开源的文本编辑器,目标是要替换notepad++。该项目是采用了C++进行开发,针对NotePad++中比较受欢迎的诸多功能与特点进行了分析和吸收,逐渐在项目中加以实现。
5310 0
Notepad--国产开源编辑器,横空出世!
|
机器学习/深度学习 传感器 人工智能
微软Build 2018亮点全揭晓:主推Azure、Microsoft 365,开源ML.Net
微软开发者大会 Build 2018 于 7-9 日在西雅图的华盛顿会议中心举行,本文带你浏览大会第一天的核心亮点。
222 0
微软Build 2018亮点全揭晓:主推Azure、Microsoft 365,开源ML.Net
|
机器学习/深度学习 人工智能 自然语言处理
Facebook发布聊天机器人平台,Bots或将取代App
Facebook 正式宣布在Messenger 上推出聊天机器人API——Messenger Platform。通过这个平台,开发者可以建构出商业应用的聊天功能,聊天机器人可以自动识别客户需求并立刻给予回复。Facebook相信,加入了聊天机器人的 Messenger 将变成一个商家与其客户互动的主要渠道。它拥有的一整套人工智能和真人介入体系,使它将代替800电话,成为商业、客服甚至可能是媒体的主要新渠道。
498 0
Facebook发布聊天机器人平台,Bots或将取代App
|
前端开发 .NET C#
一起谈.NET技术,WCF+WF双剑合璧构建微软的SOA系列(一):从一个简单的Demo开始
  本系列文章将从实例出发,以实例结尾。由浅入深讲解在我们项目中如何使用WCF和WF。我们会发现使用WCF+WF将造就出其他技术无法达到的高度。最后我会将程序架到云端。   微软.net的3W(WPF、WCF、WF)战略如下图。
1249 0
|
Linux Android开发 开发者
Google工程师多图详解An“.NET研究”droid系统架构
  近日,Google的一位工程师Sans Serif发布了一篇博文非常清楚的描述了Android系统架构,中国移动通信研究院院长黄晓庆在新浪微博上推荐了该文,并认为文中对Android的介绍很好,您可以看一下Google工程师眼中的Android系统架构是什么样的。
1411 0