鼠标钩子程序初探1

    技术2022-05-11  84

    对于windows95以来每个进程都有自己独立的4GB空间,这个每个程序相对于其他程序都是独立的,一个程序轻易不能访问其他程序地址,一旦访问了轻则跳出出错提示,重则蓝屏,然而当你离开了当前程序,却想要跟踪一些消息,就困难重重了。幸好windws 给我们提供了钩子(hook)函数。 钩子(hook)一般分为两个等级:全局钩子和局部钩子。全局顾名思义可以挂钩其他程序的消息,而局部则直挂钩使用钩子函数的进程。当然两种都要使用到dll,需要把dll注入到其他进程中,所以使用一定要小心,使用不当会影响其他程序的稳定性。下面先介绍一下windows的钩子函数: 安装钩子函数: HHOOK SetWindowsHookEx( int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId); IdHook: 钩子类型,有鼠标、键盘、巨集等等10几种 Lpfn: 挂钩的函数,用来处理拦截消息的函数。必须是全局函数 HMod: 当前进程的句柄 dwThreadId: 设置要挂接的线程ID.为NULL则为全局钩子 卸载钩子函数 BOOL UnhookWindowsHookEx(HHOOK hhk); Hhk 要卸载的钩子句柄 还有一个函数: LRESULT CallNextHookEx(HHOOK hhk,int nCode,WPARAM wParam, LPARAM lParam); 用于把拦截的消息继续传递下去,不然其他程序可能会得不到相应的消息,在一个按钮上点击,而程序不能执行,是很让人费解的。 基本写钩子程序主要是用上面的3个函数。下面就在vc下,一步一步写一个鼠标钩子。 首先当然是创始一个工程了(呵呵,废话),选择 MFC AppWizard(dll),下一步后,选择 MFC Extension Dll,接着创建 mousehook.h 和mousehook.cpp 文件 mousehook.h 文件内容如下,是不是很短小呢,选择MFC Extension(扩展) Dll就可以在 dll中使用类,其他普通和常规dll是不能办到的,不过选择了扩展dll,这个dll就只能在 MFC 程序中使用,在vb、delphi中就不能用了: // ____________________________________________________________________________ // // 类: CMousehook // 目的: 用来挂钩鼠标 // 描述: 该类会随着钩子客户端关闭而自动卸载 // ____________________________________________________________________________ #ifndef _MOUSEHOOK_ //控制头文件只包含一次 #define _MOUSEHOOK_ #define WM_MOUSE_HOOK WM_USER+110 //传递给钩子dll客户端的消息 class AFX_EXT_CLASS CMousehook:public CObject { public: CMousehook(); //析构时自动卸载钩子 ~CMousehook(); //安装钩子,把客户程序窗口句柄发给dll,拦截后dll向客户程序发送消息WM_MOUSE_POS BOOL installhook(HWND hclientwnd); //卸载钩子 BOOL uninstallhook(); //鼠标点击次数 int GetMouseClickCount(); //包含鼠标位置的数组。为什么使用POINT 结构传递坐标客户端赋值不能编译成功?? int* GetClickPosition(); }; #endif 下面是相应的实现文件: // ____________________________________________________________________________ // General Information: // File Name: mousehook.cpp // Author: ameng // Project: mousehook // Description: Implementation of class(es) CMousehook // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Revision History: // 01/04/2004 designed by ameng // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Copyright Notice: // Copyright (c) 2004 Your Company Inc. // Warning: This computer program is protected by copyright law and // international treaties. Unauthorized reproduction or distribution // of this program, or any portion of it, may result in severe civil and // criminal penalties, and will be prosecuted to the maximum extent // possible under the law. // ____________________________________________________________________________ // ================== // INCLUDE FILES // ================== #include "stdafx.h" #include #include "mousehook.h" // ================== // DEFINES // ================== #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //公共数据,用于不通进程的数据共享。不用进程都装载mousehook.dll,但都放在自己的范围,//所以mousehook类成员是不能共享的,必须创建全局数据段。在不同程序之间共享这些数据, //还需要在相应的 .def 文件中加入 SECTIONS mymousedata READ WRITE SHARED //把该全局数据段设置为读写共享 //全局共享数据段声明 #pragma data_seg("mymousedata") static HINSTANCE hinst=NULL; //注入钩子的程序句柄 static HHOOK g_hook=NULL; //钩子句柄 static HWND g_hwnd=NULL; //需要处理钩子消息的客户端句柄 static int mouseclickcount=0; //鼠标点击次数 static int position[2]={0,0};//鼠标的位置信息 #pragma data_seg() static AFX_EXTENSION_MODULE MousehookDLL = { NULL, NULL }; extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) { UNREFERENCED_PARAMETER(lpReserved); if (dwReason == DLL_PROCESS_ATTACH) { TRACE0("MOUSEHOOK.DLL Initializing!/n"); if (!AfxInitExtensionModule(MousehookDLL, hInstance)) return 0; new CDynLinkLibrary(MousehookDLL); } else if (dwReason == DLL_PROCESS_DETACH) { TRACE0("MOUSEHOOK.DLL Terminating!/n"); AfxTermExtensionModule(MousehookDLL); } //传给SetWindowsHookEx()函数的当前程序句柄; hinst=hInstance; return 1; // ok }  

    最新回复(0)