自从使用.NET WinForm后已经很长时间没用VC++ MFC写过程序了,今天一问友给出一道VC++的题。
题目:使用钩子(HOOK)实现鼠标在屏幕上移动时实时捕获当前位置坐标,并在程序对话框的文本框中实时显示。
要求:不是仅捕获鼠标在程序窗口客户区时的坐标值,而是当鼠标移出程序窗口客户区也能捕获到鼠标在屏幕中的位置坐标。
实现思路:由于局部钩子只能监视本进程内的某个指定线程的事件消息,而按照此程序要求程序窗口不是活动窗口时也能监视到鼠标位置并将坐标值传给主程序的消息处理程序进行处理,所以需要使用系统钩子(全局钩子)。又由于要捕获鼠标信息,所以要用鼠标钩子,也就是在注册钩子时将类型为WH_MOUSE。该钩子要捕获WM_MOUSEMOVE消息并将消息传递给主程序的OnMouseMove()鼠标移动消息处理函数来进行处理,并将捕获的鼠标位置坐标值显示在对话框的Edit控件中。
实现最终效果如下图,左边的图片浏览器是活动窗口,鼠标指针也在左边的窗口中,右边的程序窗口依然能获取鼠标位置并在文本框中显示坐标。
实现步骤(仅列出关键代码):
一、编写全局钩子DLL
全局钩子必须单独的编写成dll文件。在VC++中新建一DLL项目,命名为"hook",该钩了的dll入口函数代码就不给出了。主要看钩子安装函数InstallMyHook、卸载函数UninstallMyHook以及回调函数hookproc。
InstallMyHook钩子安装函数代码如下:<