NT下如何得到鼠标所指的文本并替换?(100分)

  • 主题发起人 主题发起人 chenke
  • 开始时间 开始时间
Same as in win95.
 
给个可用的例子就给分了。
 
已答问题中有的
 
GuiHookNT对截取屏幕文字没有反应,<br>GuiHook95必须点击才能截取,<br>Ie和Netscape下都无效。
 
95下一切OK<br>NT?
 
GuiHookNT的例子是我上传的,在NT下没有问题,<br>但是在NT下的IE中不幸,我没有安装NetScape.<br>
 
下文摘自磨一新闻组,希望对你有用。如要全文,我可发给你。<br>&nbsp; &nbsp;在WINDOWS系统中也采取这种技术,使系统如果调用某个函数, 先进入<br>一个跟踪函数,取得原函数的参数,再调用原来的函数。听起来是否象病毒<br>传染和发作?<br>&nbsp; &nbsp;应该放弃常规的思路, 采取一些技巧, 截获 TextOut 、ExtTextOut<br>等函数,使之转向我的跟踪函数,在此查看应用程序(学生)的堆栈中传递<br>给画笔(TextOut、ExtTextOut等函数)的参数, 从而获得应用程序要在<br>屏幕上写的“文字”。<br>七 “ &nbsp;屏幕抓字”的实现<br>1 &nbsp; &nbsp;用SetWindowsHookEx()安装鼠标钩子MouseProc;<br>2 &nbsp; &nbsp;在屏幕上移动鼠标时,系统就会调用鼠标钩子MouseProc;<br>3 &nbsp; &nbsp;进入MouseProc,获得鼠标的坐标(x,y),<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;设置对TextOut()、ExtTextOut()等的跟踪程序,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;用invalidateRect()告诉系统该点(x,y)“失效”;<br>4系统发出WM_PAINT消息,指示该点(x,y)处的应用程序重绘“失效”的区域。<br>5 &nbsp; &nbsp;负责绘制该点()的应用程序在受到 WM_PAINT 消息后, 就有机会调用<br>&nbsp; &nbsp; &nbsp; TextOut()、 &nbsp; &nbsp;ExtTextOut()等函数。<br>6 &nbsp; &nbsp;调用的函数被拦截进入跟踪程序:设置好了的跟踪程序截获了该次调用,从<br>&nbsp; &nbsp; &nbsp; 应用程序的堆栈中取出 该点(x,y)“文字”的指针;<br>7 &nbsp; &nbsp;从应用程序的数据段中将“文字”指针的内容取出,即完成了一次“屏幕抓<br>&nbsp; &nbsp; &nbsp; 字”;<br>8 &nbsp; &nbsp;退出跟踪程序,返回到鼠标钩子MouseProc;<br>9 &nbsp; &nbsp;在MouseProc中解除对TextOut() ExtTextOut()的跟踪;<br>10 &nbsp;退出MouseProc鼠标钩子程序,控制权交给系统。<br>11 &nbsp;在屏幕上移动鼠标,开始下一次“屏幕抓字”,返回步骤2。<br>
 
to pegasus:<br>IE显示文字是比较特殊的。一位做过字典(当然是可以抓词的那种)的大虾<br>告诉我,IE用Double Buffer技术,所有东东先写到内存位图里,再显示。<br>所以截取的函数就不同了...
 
GUIHOOK95在Ie和Netscape上都没问题,<br>但是GUIHOOKNT在NT下的Ie好像不行。<br>To 铃铛:谢谢,请Mail to me.
 
GuiHook95是一个16位的程序,它是这样把自己的Textout函数代替系统的Textout函数:<br>InstallProbe2(void)<br>{<br> WORD selCS , selDS ;//cs,ds为textout段地址<br> char FAR * lpJmp ;//自定义函数的地址<br> char FAR * lpCode ;<br><br> selCS = FP_SEG((void FAR *)TextOut);//取程序段地址<br> selDS = AllocCStoDSAlias(selCS ) ;//取数据段地址<br> lpCode = MK_FP ( selDS , FP_OFF( (void FAR * )TextOut ) ) ;//得到Textout函数的编译地址<br> _fmemcpy( OldCode2 , lpCode , 5 );//将机器码地址保存<br> lpCode[0] = 0xEA ;//标志<br> lpJmp = (char FAR * )&amp;Jmp2Me2;//Jmp2me2为自己的textout函数指针<br> lpCode[1]=lpJmp[0];<br> lpCode[2]=lpJmp[1];<br> lpCode[3]=lpJmp[2];<br> lpCode[4]=lpJmp[3];<br>//把自己的函数地址代替系统的textout函数地址<br> FreeSelector(selDS );<br> return TRUE;<br>}<br>简单一句话,用自己的函数地址代替系统Textout的函数地址,<br>但在Win32下 FP_SEG,MK_FP根本找不到,怎么办?<br>大虾们快帮帮我啊!
 
??To chenke:<br><br>&nbsp; &nbsp; You can not use GUIHook95 under NT, :), try modify<br>GUIHookNT, please.<br><br>To tqz:<br><br>&nbsp; &nbsp; Thanks a lot!, *-^
 
我的意思是把95下16位的GuiHook95.dll改写成32位的动态连结库,不知有没有办法?<br>
 
ie3 ok ,ie4 no
 
小弟水平太菜,看GuiHookNt下的挂Textout机制似懂非懂,拜托那位大侠指点<br>一下迷津.<br>如怎样得到系统TextOutW地址等等。先谢了。
 
铃铛, 谢谢! <br><br>&lt;a mailto:jiangjing@990.net&gt;请发给我!&lt;/a&gt;
 
多人接受答案了。
 
后退
顶部