在TSF框架中有时候我们需要通过框架上屏一些占位字符来进行定位,这时候我们就需要对预先上屏的字符进行管理,以微软的输入法为例图中红框框选出来的部分就是预先上屏的字符。
在TSF框架中通过ITfRange类来对这个上屏的字符串进行控制。在进行控制的时候我们通过ITfComposition的接口来获取对应的ITfRange实例,在获取对应的实例之后,我们就可以通过ITfRange的对应的接口来进行控制上屏的字符串了。
ITfRange中的几个比较关键的接口说明如下:
//改接口主要负责设置预先上屏的字符串的内容 HRESULT SetText( [in] TfEditCookie ec, //会话实例 [in] DWORD dwFlags, //是否纠正内容一般设置为TF_IE_CORRECTION [in] const WCHAR *pchText, //显示的内容 [in] LONG cch //内容的长度 ); //ITfRange通过两个anchor锚来对预先上屏的字符串进行选择和定位 //start-anchor......end-anchor //ShiftEnd负责对结束的锚点进行移动 HRESULT ShiftEnd( [in] TfEditCookie ec, //上下文状态 [in] LONG cchReq, //指定移动的偏移量 [out] LONG *pcch, //实际移动的偏移量 [in] const TF_HALTCOND *pHalt //指定移动的条件,一般给定为空就行 ); //ShiftStart负责对开始的锚点进行移动 HRESULT ShiftStart( [in] TfEditCookie ec, [in] LONG cchReq, [out] LONG *pcch, [in] const TF_HALTCOND *pHalt ); //如果想要移动预先上屏的字符串中的光标的话,同时移动两个锚点就可以了 //将两个锚点同时移动到某一个位置,该位置可以是 //TF_ANCHOR_START(开头)TF_ANCHOR_END(结束) HRESULT Collapse( [in] TfEditCookie ec, [in] TfAnchor aPos );
下面介绍如何在TSF输入法框架中添加ITfRange预先上屏的内容。并对其中的光标进行移动。
//TSF框架传递进来的Composition实例 ITfComposition* _pComposition; //预先上屏的字符串内容的实例 ITfRange* _pCompositionRange; //获取当前编辑状态的ITfRange if (SUCCEEDED(_pComposition->GetRange(&_pCompositionRange))) { //获取需要显示的文本内容的长度 wchar_t* content = L"ce'shi'shu'ru'fa"; int str_len = _tcslen(content); wstring output_wstr; //屏蔽掉音节分割的分割符号 for (int index = 0; index < str_len; ++index) { if (content[index] == wchar_t(L'\'')) { continue; } output_wstr.push_back(content[index]); } //向ITfRange中添加需要显示的字符 _pCompositionRange->SetText(ec, TF_IE_CORRECTION, output_wstr.c_str(), output_wstr.length()); //获取当前操作环境中的光标位置 int pos = context->cursor_pos; //设置光标的偏移位置 int sel_start = pos, sel_end = pos; //对光标位置进行移动 LONG cch; TF_SELECTION tfSelection_tmp; //将初始位置设置到内容开始的地方 pRangeComposition->Collapse(ec, TF_ANCHOR_START); //根据光标位置对预先上屏的内容中的光标进行移动 pRangeComposition->ShiftEnd(ec, sel_end, &cch, NULL); pRangeComposition->ShiftStart(ec, sel_start, &cch, NULL); //将修改设置会TSF框架 tfSelection_tmp.range = pRangeComposition; tfSelection_tmp.style.ase = TF_AE_NONE; tfSelection_tmp.style.fInterimChar = FALSE; context->SetSelection(ec, 1, &tfSelection_tmp); }
相关推荐
基于文本服务框架(tsf)的拼音输入法研究与实现摘要:目前的输入法大多采用输入法管理器-输入法编辑器(IMM-IME)进行开发,对于微软发布的新型输入法技术―文本服务框架(TSF)的研究一直比较滞后,该文论述了 TSF 的基本构成、主要接口、输入法
输入法tsf框架候选栏定位研究在开发输入法应用的时候,我们需要让候选栏时刻跟踪输入光标的位置,来进行输入。但候选栏定位不准,一直会困扰输入法的开发者。windows老的输入法框架imm在部分场景下比如chrome应用中会定位不准,
输入法管理器(IMM)函数大全(Windows CE 5.0)imm好像要被弃用了 还是研究TSF输入法 吧 ,虽然没啥鸟用了 但是还是搬运一下下吧EnumRegisterWordProc此函数是与一起使用的应用程序定义的回调函数ImmEnumRegisterW
输入法编程之 输入法管理器 输入法上下文完整的文档参考:https://docs.microsoft.com/zh-cn/windows/win32/intl/input-context"输入上下文" 是由 IMM 维护
tsf(text services framework)和输入法1.TSF输入接口IMM-IME架构成熟,稳定,易于实现,在Windows中被广泛使用,甚至在Linux曾大量使用的中文输入接口SCIM中也可以看到IMM-IME的影子。但是由于IMM-IME在操作权
微软输入法tsf sampleIME 源码分析(转载)类:CCandidateWindow,候选字窗口CCompositionPricessorEngine,拼写引擎CSampleIME,主程序CStringRange, 一个特殊的字符串类 见于 Sam
64位输入法DLL注入 (tsf)方案微软两种输入法方案XP和XP以前是imm(Input Method Manager)输入方案.xp之后的系统是imm和TSF(Text Service Framework)输入方案.共存. win8
tsf输入法TSF 即文本服务框架的英文缩写微软官方文档(文本服务框架) https://learn.microsoft.com/zh-cn/windows/win32/tsf/text-services-fra
输入法开发之:疑难杂症套娃开始:当键盘事件被触发时,获得的参数是ITfContext。但是ITfContext并不能直接修改内容添加文字等,需要调用RequestEditSession,传入一个ITfEditSession
获取输入法坐标以下是微软TSF输入法取坐标的方法,从里面扒出来的int 取坐标(ITfContext *pContext, TfEditCookie ec, ITfComposition* pRangeCompos