概述

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

TSF自定义候选词列表界面的更多相关文章

  1. 使用jsonp跨域调用百度js实现搜索框智能提示,并实现鼠标和键盘对弹出框里候选词的操作【附源码】

    项目中常常用到搜索,特别是导航类的网站.自己做关键字搜索不太现实,直接调用百度的是最好的选择.使用jquery.ajax的jsonp方法可以异域调用到百度的js并拿到返回值,当然$.getScript ...

  2. Dynamics CRM 客户端程序开发:在实体的列表界面添加按钮

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复114或者20140312可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 如果没有安装Ribbon Wor ...

  3. Android 手机卫士--设置界面&功能列表界面跳转逻辑处理

    在<Android 手机卫士--md5加密过程>中已经实现了加密类,这里接着实现手机防盗功能 本文地址:http://www.cnblogs.com/wuyudong/p/5941959. ...

  4. fcitx 候选词出现奇怪的笔画

    原来fcitx还有笔画输入的功能,输入h出现一个横,s出现竖,p是撇,n是捺,z是折. 虽然很有意思,但是不实用,而且还会出现在第一页候选词中,影响输入,可以通过配置文件禁用掉: $ vim ~/.c ...

  5. java查看当前项目所有线程列表界面

    java查看当前项目所有线程列表界面 1.TestThread(测试类) package com.isoftstone.pcis.isc.job.king.panel; public class Te ...

  6. 解决BackBox中Fcitx输入法中文输入状态下不显示候选词框的问题

    当我们安装Fcitx输入法时默认是安装了下面这个组件的: fcitx-module-kimpanel 该组件在非KDE桌面环境下可能会使Fcitx输入法在输入中文时无法显示候选词框. 使用下面的命令移 ...

  7. wxPython制作跑monkey工具(python3)-带显示设备列表界面

    一. wxPython制作跑monkey工具(python3)-带显示设备列表界面  源代码 Run Monkey.py #!/usr/bin/env python import wx import ...

  8. 借助baidu的jsonp接口,做一个自己的候选词组件

    先观察 对接口进行提炼:https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=关键词&cb=回调函数 简单测试一下: <!DOC ...

  9. java查看当前项目所有线程列表界面【转】

    java查看当前项目所有线程列表界面 1.TestThread(测试类) package com.testdemo.pcis.isc.job.king.panel; public class Test ...

随机推荐

  1. sublime 前端开发工具

    http://code.kpman.cc/2014/10/14/sublime-text-3-mac-%E6%8C%87%E5%8D%97/ gif 屏幕录制:http://recordit.co/ ...

  2. (ZZ)WPF经典编程模式-MVVM示例讲解

    http://www.cnblogs.com/xjxz/archive/2012/11/14/WPF.html 本篇从两个方面来讨论MVVM模式: MVVM理论知识 MVVM示例讲解 一,MVVM理论 ...

  3. CDZSC_2015寒假新人(1)——基础 f

    Description An inch worm is at the bottom of a well n inches deep. It has enough energy to climb u i ...

  4. Java通过axis调用.NET WebService

    前面已经记录过通过axis调用webservice,昨天在对接.NET接口时,发现在传递参数时和一般的传参方法是不一样的,在接口方哥们的帮助下解决了.哈哈. import java.net.URL; ...

  5. JDBC之一:JDBC快速入门

    (1)下载Oracle的JDBC驱动,一般放在$ORACLE_HOME/jdbc/lib目录,关于驱动的版本请见: http://elf8848.iteye.com/blog/811037 随Orac ...

  6. MYSQL 查看可用的字符集的 2 方法

    方法 1. show character set; 方法 2. show collation;

  7. MYSQL 中的变量

    1.用户自己定义变量 2.系统变量(全局变量,会话变量) ----------------------------------------------------------------------- ...

  8. js为数字添加千位分隔符

    1.字符串处理比较复杂 function test(str){   var iNum = str.length % 3;   var prev = '';   var iNow = 0;   var ...

  9. Oracle EBS-SQL (BOM-14):检查工艺路线明细.sql

    select msi.segment1                                         装配件编码,       msi.description             ...

  10. Apriori algorithm

    本文是个人对spmf中example1. mining frequent itemsets by  using the apriori algorithm的学习. What is Apriori? A ...