这个问题搜索一下,有不少帖子,但都没有真正的结论。
我也试验了好久,觉得眼看就要成功了,拿出来跟大家讨论讨论。
首先,要把POST和SENDMESSAGE的函数都勾进去,即sendmessageproc,getmessageproc因为WM_CHAR用于截获英文字符,用GETMESSAGE,但WM_IME开头的
一系列函数必须用SENDMESSAGE。截获汉字用WM_IME_CHAR,但不够!IE,WORD等都无法截获。
……我就做到这里,快考试了,比较忙,因此这个思路还没有调通。大家试试看吧!有好消息分享出来
另外一个思路是APIHOOK注入IME输入法,我很不赞同这种方法,
毕竟APIHOOK很,把所有进程都FUCK了。:)notice:表示关注或者转贴搜索帖子的不给分
不错,用WH_CALLWNDPROC的钩子截获WM_IME_COMPOSITION消息if(cs->message==WM_IME_COMPOSITION)//截获中文输入
{
if(cs->lParam&GCS_RESULTSTR)
{
HIMChImc;
DWORDdwSize;
char*Buf;hImc=ImmGetContext(GetActiveWindow());
dwSize=ImmGetCompositionString(hImc,GCS_RESULTSTR,NULL,0);
Buf=newchar[dwSize+1];ImmGetCompositionString(hImc,GCS_RESULTSTR,(LPVOID)Buf,dwSize);Buf[dwSize]='\0';
ImmReleaseContext(GetActiveWindow(),hImc);Form1->Memo1->Lines->Add(">:"+AnsiString(Buf));
deleteBuf;
}
}
我试了一下:luckypopy(菜鸟)的方法,截获了双份,就是说,在我使用微软拼音打出一个句子后,这个消息出现了两次。
还有问一个Dll的问题;):
我要在Dll中截获,并且得到字符串,那么我应该怎样传给应用程序呢?肯定不能用指针,我试了使用GlobalAlloc()发现不行,(我设的是Moveable的)
请大家到下面这个连接去继续讨论。谢谢
?id=1403176
通过我连续3天的奋斗,我明白一个道理。
Windows的IME消息很多,很多!
而各输入法处理这些消息的方法不同,表现出来的就是微软拼音2。0和3。0的一个显著不同就是空格的作用,3。0可以用空格代替回车。
而那些全拼,紫光,智能ABC,更是乱七八糟,一塌糊涂。
开发输入法很难,但是做个输入法的钩子更难。只能针对一个特定的输入法才行!!而这样做,似乎意义不大了。难道针对每一个市面上的输入法都做一个。或者自己做个通用的,可以设置各种参数的钩子!看来还是要先做一个输入法才行!
光截IME消息是不够的.有时候一些IME程序不是很标准.而且一两个IME消息也不行.
我看还是APIHOOK机制好点.在类似SetWindowText,TextOut....函数,得到汉字消息,然后再搞个管理模块,把得到的汉字消息发送此处.不知道我的想法,可行否
我奋斗的结果,就是基本上各种输入法在XP下没问题了,
毕竟应用程序和输入法之间的接口必须固定,而我们截获的
正是这个接口可是在特殊情况下,比如输入法不停切换时就会发生丢字甚至乱码
相信是可以完善的
看看有的跟贴,好像有人还不懂什么是全局键盘钩子
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-25252-1.html