屏幕上的文字大都是由gdi32.dll的以下几个函数显示的:TextOutA、TextOutW、ExtTextOutA、ExtTextOutW。实现屏幕抓词的关键就是截获对这些函数的调用,得到程序发给它们的参数。
我的方法有以下三个步骤:
一、得到鼠标的当前位置
通过SetWindowsHookEx实现。
二、向鼠标下的窗口发重画消息,让它调用系统函数重画
通过WindowFromPoint,ScreenToClient,InvalidateRect 实现。
三、截获对系统函数的调用,取得参数(以TextOutA为例)
1.仿照TextOutA作成自己的函数MyTextOutA,与TextOutA有相同参数和返回值,放在系统钩子所在的DLL里。
SysFunc1=(DWORD)GetProcAddress(GetModuleHandle("gdi32.dll"),"TextOutA");
BOOL WINAPI MyTextOutA(HDC hdc, int nXStart, int nYStart, LPCSTR lpszString,int cbString)
{ //输出lpszString的处理
return ((FARPROC)SysFunc1)(hdc,nXStart,nYStart,lpszString,cbString);}
2.由于系统鼠标钩子已经完成注入其它GUI进程的工作,我们不需要为注入再做工作。
如果你知道所有系统钩子的函数必须要在动态库里,就不会对“注入”感到奇怪。
我的方法有以下三个步骤:
一、得到鼠标的当前位置
通过SetWindowsHookEx实现。
二、向鼠标下的窗口发重画消息,让它调用系统函数重画
通过WindowFromPoint,ScreenToClient,InvalidateRect 实现。
三、截获对系统函数的调用,取得参数(以TextOutA为例)
1.仿照TextOutA作成自己的函数MyTextOutA,与TextOutA有相同参数和返回值,放在系统钩子所在的DLL里。
SysFunc1=(DWORD)GetProcAddress(GetModuleHandle("gdi32.dll"),"TextOutA");
BOOL WINAPI MyTextOutA(HDC hdc, int nXStart, int nYStart, LPCSTR lpszString,int cbString)
{ //输出lpszString的处理
return ((FARPROC)SysFunc1)(hdc,nXStart,nYStart,lpszString,cbString);}
2.由于系统鼠标钩子已经完成注入其它GUI进程的工作,我们不需要为注入再做工作。
如果你知道所有系统钩子的函数必须要在动态库里,就不会对“注入”感到奇怪。