亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于文本服務框架的拼音輸入法研究與實現

        2016-06-17 20:26:14胡曉張征
        電腦知識與技術 2016年11期

        胡曉++張征

        摘要:目前的輸入法大多采用輸入法管理器-輸入法編輯器(IMM-IME)進行開發(fā),對于微軟發(fā)布的新型輸入法技術—文本服務框架(TSF)的研究一直比較滯后,該文論述了 TSF 的基本構成、主要接口、輸入法的具體實現方法以及后續(xù)的改進,并使用該技術實現一款基本 TSF 輸入法,供相關領域的研究人員參考。

        關鍵詞:拼音輸入法;文本服務框架;動態(tài)鏈接庫;文本服務;輸入法安裝

        中圖分類號:TP311 文獻標識碼:A 文章編號:1009-3044(2016)11-0206-03

        Abstract:Most of the current input method are developed by the method of the input method manager-input method editor(IMM-IME), the research of the new IME technology—text service framework(TSF)that Microsoft released has been a lag. This paper discusses the basic composition of TSF, main interface and the concrete realization way of input method and subsequent improvements, and use this technology to achieve a basic TSF input, provides the reference for researchers in related fields.

        Key words:pinyin input method; TSF; DLL; text service;installation of input method

        1 背景

        輸入法是指為將各種按鍵序列轉化為字符,輸入計算機或其他設備(如手機、平板)而采用的編碼方案,因此輸入法的研究是信息處理的一個重要課題[1]。Windows 提供了兩套輸入法框架:在 Windows XP及之前,是 IMM(Input Method Manager),即輸入法引擎,基于純函數 API;Windows XP 及以后,提供了新的輸入法框架 TSF(Text Service Framework),是基于 COM(組件對象模型)的。目前現有的各個版本輸入法大多采用輸入法管理器—輸入法生成器(IMM-IME)框架進行開發(fā),然而在 Windows 8系統(tǒng)中 Metro 風格的應用是不支持該框架的,在這些應用下進行輸入,需要使用文本服務框架(TSF)開發(fā)的輸入法。本文將主要介紹TSF框架的基本構成,輸入法的設計以及安裝要點。

        2 TSF的構成和基本工作過程

        2.1 基本概念

        1)什么是 TSF

        TSF 為高級文本和自然語言輸入技術提供了一個簡單、可擴展的框架,是一項從 Windows XP 開始提供的設備無關、語言無關的系統(tǒng)服務。TSF與傳統(tǒng) IME 相比雖然對鍵盤輸入法的作用沒有太大區(qū)別,但是支持 TSF 的應用程序可以從任何支持TSF的文本服務中接收文本輸入(例如手寫、語音輸入),而不用考慮有關文本來源的具體細節(jié)。

        2)TSF 體系結構[2]

        TSF 主要由應用程序、文本服務和TSF管理器三個部分組成,其結構如圖1所示:

        應用程序(Applications):應用程序的任務一般包括顯示、直接編輯以及文本存儲,通過實現 COM 服務來提供文本訪問的能力。

        文本服務(Text Services):向應用程序提供文本,同樣用 COM 實現,內置了注冊為 TSF 的服務過程。多個文本服務允許同時被注冊,可以包含文本的輸入與輸出,還可以作為一段文本的數據和屬性的關聯體。

        TSF管理器(TSF Manager):作為文本服務與應用程序之間中間層,TSF 管理器支持一個應用程序同時建立多個與文本服務之間的聯系,共享文本內容。其功能是由操作系統(tǒng)實現的。

        2.2 與應用程序的交互

        TSF 的優(yōu)點在于其設備無關,語言無關,并且可擴展的特性,同時能夠給用戶提供一致的輸入體驗。任何 TSF-enabled 的應用程序都能從任何 Text Service 接收文本,同時可以輸出文本,而不需要知道文本來源的詳細信息。同時,文本服務也不需要考慮各種不同應用之間的差別。

        TSF 是應用與 IME 之間的中介,TSF 將輸入事件傳遞給 IME 并在用戶選擇字符后接收從 IME返回的輸入字符。

        3 輸入法的設計與具體實現

        3.1 主要接口函數的實現

        與傳統(tǒng) IME 必須要實現的 ImeInquire,ImeConfigure,ImeProcessKey,ImeToAsciiEx等接口函數[3]不同,文本服務框架包含了一組新的接口函數,具體實現方法也有所不同。其中一些重要的接口如下[4]:

        文本輸入處理(ITfTextInputProcessor):ITfTextInputProcessor是創(chuàng)建文本服務需要實現的第一個接口,繼承自 IUnknown 接口,由 TSF 管理器調用來實現文本服務的激活與停用。

        線程管理器事件接收器(ITfThreadMgrEventSink):該接口允許文本服務來接收與響應事件焦點的變化。在 TSF 中,事件通知由被稱之為事件接收器的 COM 對象收取,因此,客戶端需要實現一個 ITfThreadMgrEventSink 對象,并安裝事件接收器,從而獲得線程管理器發(fā)送的事件通知。在TSF中,應用程序和文本服務被定義為客戶端。

        文檔管理器(ITfDocumentMgr):文檔管理器的作用是管理編輯的內容,開發(fā)者可通過ITfDocumentMgr 接口創(chuàng)建。每個文檔管理器都維護著一個后進先出的緩沖區(qū),通常稱之為內容棧,用來存儲對應的文檔管理器所管理的編輯內容列表。

        語言欄按鈕項目信息(ITfLangBarItemButton):該接口也繼承自 IUnknown 接口,實現一些語言欄上按鈕項的信息,例如圖標、文本、點擊彈出的菜單項等。

        編輯會話(ITfEditSession):編輯會話由文本服務實現并由TSF管理器調用來讀取或者修改文本和屬性的上下文。

        輸入組合(ITfComposition):輸入組合接口由 TSF 管理器實現,同樣繼承自 IUnknown 接口。應用程序顯示什么樣的文本,以及是否顯示文本,需要獲取輸入組合的顯示屬性信息,通過判斷輸入組合是否存在,將其狀態(tài)顯示給用戶。

        編輯內容查看對象(ITfContextView):文本服務為候選列表創(chuàng)建新的內容后,ITfContextView接口的 GetTextExt 方法可返回文本邊界框的屏幕坐標。

        除了以上接口,TSF 還有線程管理器(ITfThreadMgr)、客戶端標識符(ITfClientId)、鍵盤事件接收器(ITfKeyEventSink)、屬性設置(ITfProperty)等一些重要接口需要實現,此處不再一一贅述。

        3.2 輸入法的基本實現步驟

        3.2.1 創(chuàng)建空白的動態(tài)鏈接庫項目

        輸入法程序實際上就是一個動態(tài)鏈接庫程序【5】,只是這個動態(tài)鏈接庫較特殊,文件名的后綴是 .ime 而不是 .dll。

        1)在 DLL_PROCESS_ATTACH 事件中,使用 RegisterClass 注冊用戶界面窗口類??筛鶕€人喜好設計的狀態(tài)窗口、編碼窗口以及候選窗口的屬性。

        2)在 DLL_PROCESS_DETACH 事件中,注銷上述與注冊的窗口對象并釋放該對象使用的所有系統(tǒng)資源。

        3.2.2 文本服務模塊的設計

        用戶可使用語言欄或鍵盤來與文本服務進行交互,因此首先要創(chuàng)建一個文本服務并將其注冊。要使文本服務被應用程序所使用,需要將其注冊為標準 COM 嵌入進程服務項,即注冊到文本服務框架中。TSF 通過 ITfInputProcessorProfiles 與 ITfCategoryMgr 兩個接口來提供簡單的注冊過程支持。

        線程管理器(ITfThreadMgr)是TSF Manager的基本組成部分,完成應用程序與客戶端之間進行聯系的公共任務,包括跟蹤輸入焦點的改變。同時線程管理器還負責向客戶端發(fā)送事件通知,客戶端通過實現 ITfThreadMgrEventSink 對象,并使用ITfSource::AdviseSink方法安裝事件接收器,獲得事件通知。

        文本服務使用文檔管理器獲取編輯內容,ITfTextEditSink 接口允許文本服務接收與響應焦點變化事件,對于一個文本服務或者應用程序來說,這個接口的實現是可選的。

        需要注意的是,IME 必須與系統(tǒng)任務欄兼容[6]。任務欄僅為兼容的 IME 顯示其圖標,對于不兼容的則無法顯示。我們需要將 IME 圖標存儲在 DLL 或 EXE 文件中,而不是獨立的 .ico 文件中。

        3.2.3 完成按鍵的映射

        除了語言、手寫識別,最常用的仍然是鍵盤的識別。按鍵的映射是輸入法設計的一個重要部分,顧名思義,也是我們最熟悉的一個部分,這里通過虛鍵實現對一般按鍵與功能按鍵的響應,來完成輸入過程。

        首先需要使用 Windows 宏 MAKELANGID 創(chuàng)建語言標識符,它包含一個主要語言標識符與一個從語言標識符,返回值同樣也是語言標識符,通過 ITfInputProcessorProfileMgr 的 RegisterProfile 方法來實現注冊。對于拼音輸入法,使用MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED) 即可。

        按鍵事件的處理受到幾個因素的影響:鍵盤可用狀態(tài)、鍵盤開啟狀態(tài)、輸入狀態(tài)、空閑狀態(tài)、中英文狀態(tài)等等,在 TSF 中,公共緩沖池為數據共享提供了數據存儲和消息處理的機制,以支持客戶端程序之間的數據共享。對于鍵盤來說,公共緩沖池 GUID_COMPARTMENT_KEYBOARD_DISABLED 針對的是編輯內容,是預定義的,如果它的值為非零值,那么鍵盤不可用;而GUID_COMPARTMENT_KEYBOARD_OPENCLOSE針對的是線程管理器,如果它為非零值,那么鍵盤處于開啟狀態(tài)。我們通過 ITfCompartmentMgr 接口的 GetCompartment 方法來檢查鍵盤是否可用。關于按鍵的處理如圖 2 所示:

        接下來實現 ITfKeyEventSink 接口來處理擊鍵事件,該接口包含了 OnKeyDowm、OnKeyUp、OnSetFocus 等方法分別處理按鍵按下、按鍵彈起與一個 TSF 文本服務接收或者失去鍵盤焦點時的事件。同時, ITfKeystrokeMgr 接口也同樣重要,它允許文本服務與鍵盤管理器的交互。

        3.2.4 輸入組合與候選列表的處理

        文本服務通過調用 ITfContextComposition::StartComposition 方法創(chuàng)建輸入組合,并通過創(chuàng)建 ITfCompositionSink 對象接收輸入組合的事件消息,使用 ITfContextComposition::EndComposition 方法來結束輸入組合。

        在創(chuàng)建輸入組合的同時,文本服務需要提供在應用程序中區(qū)別組合輸入文本與常規(guī)文本的顯示屬性支持,通過在 TF_DISPLAYATTRIBUTE 結構中定義文本前景色、背景色,下劃線的樣式、色彩、粗細等,來實現顯示屬性的提供。首先需要調用 ITfCategoryMgr::RegisterCategory 方法,把文本服務注冊為服務提供者,然后實現 ITfDisplayAttributeProvider 與 IEumTfDisplayAttributeInfo 接口并使它們可用,最后為文本服務提供的每種顯示屬性實現一個 ITfDisplayAttributeInfo 對象。

        接下來是關于候選列表的處理,用戶輸入字符后,輸入法需要提供一個合適的候選列表以便用戶從中選擇結果串。創(chuàng)建一個候選列表首先要實現候選窗口的創(chuàng)建與注冊,然后完成事件的處理部分,如翻頁、選擇等,最后實現窗口的銷毀和隱藏。需要通過ITfTextLayoutSink、ITfIntegratableCandidtateListUIElement等接口一一實現。

        3.2.5 把文本服務注冊為標準 COM 進程服務項

        文本服務是作為一個 COM 來實現的,所有進程內 COM 服務器(In-Process COM Server)輸出四個標準函數:DllRegisterServer、DllUnRegisterServer、DllGetClassObject和DllCanUnloadNow。我們需要在模塊定義文件(.def)中導出這四個接口函數,這樣才能夠將輸入法在系統(tǒng)中注冊。

        DllRegisterServer 用 Windows 注冊表來注冊 COM 對象,而 DllUnRegisterServer 與 DllRegisterServer 的作用正好相反, DllUnRegisterServer負責移除 DllRegisterServer 注冊在 Windows 注冊表中的所有項。

        DllGetClassObject 負責提供給 COM 一個類廠,該類廠用于創(chuàng)建一個 COM 對象。而 COM 負責調用 DllCanUnloadNow 來看是否可以從內存中卸載 COM 服務器。

        4 輸入法的安裝要點

        關于輸入法 ime 有兩種安裝方式:

        1)使用第三方安裝程序,如 Flexera Software提供的 InstallShield 來創(chuàng)建 IME 安裝體驗。使用這種方法導入自己的詞庫與所生成的 ime 文件,創(chuàng)建一個 Setup.exe 文件,從而可以讓用戶安裝自己編寫的 IME。具體步驟可參考 MSDN 支持文檔。

        2)使用 Regsvr32 命令。Regsvr32 命令用于注冊動態(tài)鏈接庫文件,是 Windows 系統(tǒng)提供的用來向系統(tǒng)注冊或者卸載控件的命令,以命令行方式運行。具體步驟是將所生成的輸入法 .ime 文件拷貝到系統(tǒng) System 文件夾下,然后在 cmd 下運行 Regsvr32 輸入法 .ime 即可。但是這種方式會有一些問題,輸入法的圖標無法使用,不過不影響測試。

        5 結束語

        作為新一代輸入法框架,TSF 是一個允許進行高級的、來源無關的文本輸入的應用編程接口,它為高級文本和自然語言輸入技術提供了一個簡單和可擴展的框架。本文主要討論了 TSF 的基本概念以及注意事項,并且使用 TSF 實現了一款簡單的輸入法軟件。關于圖標不能顯示的問題還有待解決,另外,對于一個完整的輸入法來說還有軟鍵盤、鼠標輸入、系統(tǒng)圖標、菜單設置、輸入法皮膚等方面需要一一實現[7],同時,輸入效率也是一個不容忽視的部分,有關輸入轉換算法還需要進一步的研究。

        參考文獻:

        [1] 李培峰, 朱巧明. 析 Windows 95/98/NT 平臺多文種 IME 的設計技術[J]. 計算機工程與科學, 2000, 22(4): 67-70.

        [2] 王世元. 基于文本服務框架的拼音輸入法客戶端設計與實現[D]. 哈爾濱: 哈爾濱工業(yè)大學, 2013.

        [3] 胡宇曉, 馬少平, 夏瑩. 基于 IMM-IME 輸入法接口的實現方法[J]. 計算機工程與應用, 2002(1): 117-124.

        [4] Microsoft Corporation Company. Text Services Framework[EB/OL]. http://msdn.microsoft.com/zh-cn/library/windows/apps/ms629032.aspx.

        [5] 劉政怡, 李煒, 吳建國. 基于IMM-IME的漢字鍵盤輸入法編程技術研究[J]. 計算機技術與發(fā)展, 2006, 16(12): 43-48.

        [6] Microsoft Corporation Company. Requirements for IME development[EB/OL]. http://msdn.microsoft.com/en-us/library/windows/apps/hh967425.aspx.

        [7] 焦翠珍, 戴文華. 輸入法程序設計技術初探[N]. 咸寧師專學報, 200, 21(3): 73-77.

        伊人久久大香线蕉在观看| 国产精品视频一区二区三区不卡| 国产盗摄xxxx视频xxxx| 亚洲av无码av在线播放| 超碰性爱| 国产一区二区三区青青草| 99久久99久久精品免费看蜜桃| 藏春阁福利视频| 亚洲无AV码一区二区三区| 97人妻中文字幕总站| 在厨房被c到高潮a毛片奶水| 300部国产真实乱| 中文字幕一区二区三区人妻精品| 亚洲免费福利视频网站| 最新欧美精品一区二区三区| 四川老熟女下面又黑又肥| 丰满少妇爆乳无码专区| 成人性生交大片免费看激情玛丽莎 | 91国内偷拍一区二区三区| 亚洲av高清一区二区三| 欧美极品少妇无套实战| 亚洲tv精品一区二区三区| 国产成人美涵人妖视频在线观看| 亚洲国产精品成人久久久| 国产午夜三级一区二区三| 久久精品中文字幕第一页| 中文字幕一区二区综合| 女女女女女裸体处开bbb| 国产在线观看入口| 国产成人自拍视频在线观看网站| 我和隔壁的少妇人妻hd| 欧美巨大巨粗黑人性aaaaaa| 无码av免费精品一区二区三区| 欧美日韩人妻| av资源在线播放网站| 区一区二区三免费观看视频| 熟妇熟女乱妇乱女网站| 伊人久久网国产伊人| av一区二区三区高清在线看| 精品无码av一区二区三区不卡| 色综合中文综合网|