取得输入法选字框中的字

前段时间客户提了个变态需求,要求使用IME standard 输入法(这是个日文输入法)正在输入中时,如果焦点要迁出,为输入完的文字自动完成输入。。。好变态啊。。。 后来一直忙,这个需求就一直作为OpenIssue放着,但是这两天客户又催了,调研吧、、、 Windows API中有一个接口:ImmGetCandidateList,通过这个函数可以得到输入法选字框中文字的信息。得到的文字信息存放在一个结构体中: typedef struct tagCANDIDATELIST { DWORD dwSize; DWORD dwStyle; DWORD dwCount; DWORD dwSelection; DWORD dwPageStart; DWORD dwPageSize; DWORD dwOffset[1]; } CANDIDATELIST 这是个很诡异的结构体: dwSize : Size, in bytes, of the structure, the offset array, and all candidate strings. dwSize = CANDIDATELIST所占的字节数+dwCount*4+待选框的文字信息所占的字节数。 dwStyle: Candidate style values。详情看msdn,这里不研究它。 dwCount: Number of candidate strings。 实际上,不应该叫做待选框中文字的个数,应该是待选框中的选项的个数。 dwSelection: Index of the selected candidate string。 待选框中处于选择状态的选项的index。 dwPageStart:参见MSDN dwPageSize:参见MSDN dwOffset:重头戏到了,先看MSDN的解释: Offset to the start of the first candidate string, relative to the start of this structure. The offsets for subsequent strings immediately follow this member, forming an array of 32-bit offsets. 很晕吧,呵呵。dwoffset 是一个只有一个元素的数组。dwOffset[0]中存储的是一个偏移量。这个偏移量的意义是:CANDIDATELIST 对象的起始内存地址与文字信息存储的内存地址的字节数之差。 即: 假设ImmGetCandidateList 函数返回的CANDIDATELIST 对象是:stCandList。那么: (byte*)&(stCandList)+stCandList.dwOffset[0] 这个内存地址就是文字信息的起始地址。 解说到这里,如果用C++ 来写这个程序应该没什么问题了。对于C++来说,调用Windows API,操作内存都是拿手好戏。。。但是,我们的程序是必须要用C#写得。 使用C#如何调用Windows API,如何直接操作内存呢?呃,看下一篇吧。。。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值