
,而是当鼠标移出程序窗口客户区也能捕获到鼠标在屏幕中的位置坐标。要求:不是仅捕获鼠标在程序窗口客户区时的坐标值。getclientrect取得窗口客户区(不包括非客户区)在客户区坐标系下的rect坐标,可以得到窗口的大小,而不能得到相对屏幕的位置,因为这个矩阵是在客户区坐标系下(相对于窗口客户区的左上角)的。
实现思路:由于局部钩子只能监视本进程内的某个指定线程的事件消息,而按照此程序要求程序窗口不是活动窗口时也能监视到鼠标位置并将坐标值传给主程序的消息处理程序进行处理,所以需要使用系统钩子(全局钩子)。又由于要捕获鼠标信息,所以要用鼠标钩子,也就是在注册钩子时将类型为WH_MOUSE。该钩子要捕获WM_MOUSEMOVE消息并将消息传递给主程序的OnMouseMove()鼠标移动消息处理函数来进行处理,并将捕获的鼠标位置坐标值显示在对话框的Edit控件中。
实现最终效果如下图全局鼠标钩子,左边的图片浏览器是活动窗口,鼠标指针也在左边的窗口中,右边的程序窗口依然能获取鼠标位置并在文本框中显示坐标。

实现步骤(仅列出关键代码):

一、编写全局钩子DLL
全局钩子必须单独的编写成dll文件。在VC++中新建一DLL项目,命名为"hook",该钩了的dll入口函数代码就不给出了。主要看钩子安装函数InstallMyHook、卸载函数UninstallMyHook以及回调函数hookproc。
InstallMyHook钩子安装函数代码如下:
----------------------------------------------------------------------------------------------------------------------
__declspec(dllexport) BOOL InstallMyHook(HWND hWnd){

//调用setwindowshookex函数注册钩子,hinst是本钩子当前实例句柄,在本dll入口函数中被赋值。//调用setwindowshookex函数注册钩子,hinst是本钩子以后实例句柄,在本dll入口函数中被赋值。由此可以推断,extend.dll随explorer.exe或者ieplorer.exe启动时,会向系统注册webbase.dll中的钩子函数全局鼠标钩子,接着再是加载webbase.dll时,该dll的dllmain入口函数会向当前进程注入jmp指令。
hook = SetWindowsHookEx(WH_MOUSE,(HOOKPROC)hookproc,hInst,0);
if(!hook){return FALSE;} //如果注册失败返回FALSE
hWndMain = hWnd; //hWndMain保存着调用此DLL的窗口句柄,是调用DLL的时候传进来的啦。
return TRUE; //钩子注册成功返回TRUE

} // HOOK安装函数
----------------------------------------------------------------------------------------------------------------------
该段代码的主要部分是钩子注册函数SetWindowsHookEx,它的主要框架如下:
hhook setwindowshookex( int idhook,hookproc lpfn, instancehmod,dword dwthreadid)。hhook setwindowshookex(int idhook,hookproc lpfn,hinstance hmod,dword dwthreadid)。hhook setwindowshookex(int idhook,hookproc lpfn, hinstance hmod, dword dwthreadid)。
int idHook : 要捕获消息的类型,因为我要捕获鼠标的,所以在此处设为WH_MOUSE;

HOOKPROC lpfn :捕获消息的处理函数,就是说捕获到消息后由哪个函数去处理;
HINSTANCE hMod : 如果是全局函数的DLL,则此参数为DLL当前实例的句柄,否则为NULL;
DWORD dwThreadId :与安装的钩子线程相关联的线程ID,如果是全局钩子此参数设为0;
UninstallMyHook钩子卸载函数代码如下:
//调用unhookwindowshookex函数卸载钩子 if(unhooked) hwndmain = null。最后,调用unhookwindowshookex()函数完成对钩子的卸载:。我们重点看一下这个钩子处理函数(另外两个导出函数比较简单,只是通过调用setwindowshookex和unhookwindowshookex实现安装/卸载钩子函数。
----------------------------------------------------------------------------------------------------------------------
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-107382-1.html
来的好