高分寻sdk高手,讨论一个WINAPI的实现机理:ImmGetCandidateList

ManFred2ManFred 2006-11-21 04:29:13
如题,这个API是获取一个CANDIDATELIST结构的指针,其中存储了被IME转换过的备选字符列表。但他获取的仅仅是一个原始CANDIDATELIST的copy。同时我还可以通过另一种途径获取原始的CANDIDATELIST那就是:
hIMC = ImmGetContext(hWnd); //hWnd是拥有这个输入上下文的窗口
lpIMC = ImmLockIMC(hIMC);
lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo);
lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo+lpCandInfo->dwOffset[0]);
这时候问题就出现了,对于“智能ABC”输入法,我用两种途径所获得的CANDIDATELIST内容是相同的,但是对于其他大多数输入法如:微软拼音,我用地二种方法所得到的CANDIDATELIST其内容却与第一种方法不同,我在这个CANDIDATELIST种根本找不到备选的那些汉字。如果说微软拼音应用了与默认结构不同的CANDIDATELIST(就像freepy中的MYCAN一样),那么ImmGetCandidateList又是怎么实现的呢?
我的最终目的是希望获取内存中真正的CANDIDATELIST,请各位高手给以指点。
谢谢!
...全文
380 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sbkopoky 2007-02-17
  • 打赏
  • 举报
回复
有一个香港和悦网络电话的源文件 ,有兴趣妨进入我的BLOG看看
ManFred2ManFred 2006-11-22
  • 打赏
  • 举报
回复
这个我好像找到原因了,好像与TSF(Text Service Framework)有关,我还在进一步研究中。另外ImmLockIMC得到的地址确实存储着一个lpIMC(输入上下文结构),而lpIMC->hCandInfo则是一个指向LPCANDIDATEINFO的指针(即指向指针的指针)。还是非常感谢keiy()高手对我问题的关注!
柯本 2006-11-22
  • 打赏
  • 举报
回复
稍稍研究了一下,用ImmLockIMC得到的地址在系统区(应用程序不可读),估计imm32.dll加载在系统区的(我找遍整个应用程序内存也没有找到),这样的话,要实现你的功能就有难度了
ManFred2ManFred 2006-11-21
  • 打赏
  • 举报
回复
楼上这位朋友,确实不错,这样可以得到汉字,但buff只是一个copy。我想知道这些汉字的真正内存地址。我可以借此修改它从而修改输入法的显示
柯本 2006-11-21
  • 打赏
  • 举报
回复
我用以下方法.可以得到CANDIDATELIST中的汉字(拼音或自定义的输入法)
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if (GetKeyboardLayout(0) == 0 )
Memo1->Lines->Add("eee");
HIMC hIMC = ImmGetContext( Handle );
int dwSize = ImmGetCandidateList( hIMC, 0, NULL, 0 );
Memo1->Lines->Add(dwSize);
if (dwSize==0)
return;
PCANDIDATELIST buff=(PCANDIDATELIST)new char[dwSize];
ImmGetCandidateList(hIMC, 0, buff, dwSize);
int i=0;
String x="" ;
while ((i < buff->dwCount - buff->dwSelection) && (i < buff->dwPageSize ))
{
x.cat_printf(" %d.%s",i,(char *)buff +buff->dwOffset[buff->dwSelection + i]);
i++;
}
Memo1->Lines->Add(x);
ImmReleaseContext(Handle,hIMC );
}

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧