TSF自定義候選詞列表界面


概述

TSF(Text Service Framework),已經取代IMM(Input Method Manager),成為win8+系統的輸入法框架。現在有個需求,觸摸屏上要使用軟鍵盤(虛擬鍵盤,已經有了)輸入中文,當需要輸入的時候自動彈出軟鍵盤,系統自帶的屏幕鍵盤不能滿足需求。盡管網上也有自動彈出軟鍵盤的例子,但是win10上沒有測試通過,另外系統自帶軟鍵盤的界面風格跟我們的應用程序不符。所以希望自定義的軟鍵盤(不用實現輸入法)可以提供候選詞列表以及組合字符串。

實現思路

首先想到的是,直接調用TSF接口把一個字符串轉換成候選詞,主要接口ITfFnSearchCandidateProvider,測試了微軟拼音、百度拼音、搜狗拼音以及QQ拼音,只有搜狗拼音可以拿到接口,但卻拿不到候選詞。想來這個接口對輸入法的主要功能沒有意義,所以很多輸入法沒有實現這個接口。

此法不通,另尋他法,從網上看到全屏游戲中經常會隱藏輸入法的候選詞界面自己提供,需要輸入法支持UILess Mode,接着測試了前面的那些輸入法,發現它們在win10中都可以隱藏候選詞界面,而且除了搜狗(C#下拿不到ITfUIElement接口),其他輸入法都可以拿到候選詞。使用了GitHub上.Net平台TSF的一個封裝TSF.TypeLib

主要接口ITfUIElementSink,當輸入法程序需要顯示界面時,TSF Manager通過這個接口通知應用程序,應用程序可以選擇是否使用輸入法提供的候選詞界面。

實現步驟如下:

  • 獲取ITfThreadMgrEx接口實例;
  • 調用ITfThreadMgrEx::ActivateEx激活輸入法,激活標識傳入TF_TMAE_UIELEMENTENABLEDONLY;
  • 獲取ITfSource接口實例,.Net下通過ITfThreadMgrEx強制轉換拿到;
  • 實現ITfUIElementSink接口的三個方法BeginUIElement、UpdateUIElement和EndUIElement,在BeginUIElement中可以通知輸入法自定義候選詞界面,在UpdateUIElement獲取候選詞並展現。

候選詞拿到了,接着還想在軟鍵盤上顯示組合字符串,從網上查到ITfContextOwnerCompositionSink接口可以實現,但是自己測試沒有成功,最終使用ITfTextEditSink和ITfThreadMgrEventSink接口拿到,參考了MSDN上的這篇文章

總結

需求實現,明明研究了辣么久,總結下來就這么一丟丟,o(︶︿︶)o 唉,嘿嘿,不管了,反正自己個兒覺着拯救了全世界^O^ ^O^ ~~

栗子在這里o(∩_∩)o 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM