鼠标钩子程序初探1

来源:互联网 发布:单片机项目外包网 编辑:程序博客网 时间:2024/05/24 07:07
对于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
}
 
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子学习注意力不集中怎么办 1岁宝宝皮肤黄怎么办 三岁宝宝太皮怎么办 一岁宝宝太皮了怎么办 5岁宝宝学习太皮怎么办 2岁宝宝太皮了怎么办 身上的皮肤很干怎么办 小孩子挑食厌食不吃饭怎么办 1岁宝宝特别淘气怎么办 4岁宝宝有多动症怎么办 3岁宝宝有多动症怎么办 6个月婴儿睡眠少怎么办 7个月婴儿睡眠少怎么办 孩子好动注意力不集中怎么办 学生在课堂上爱讲话怎么办? 幼儿园老师圢小孩脸怎么办 宝宝上幼儿园坐不住怎么办 宝宝在幼儿园总是坐不住怎么办 早教课上宝宝坐不住怎么办? 孩子在幼儿园上课坐不住怎么办 小孩不会写拼音a怎么办 小朋友上课注意力不集中怎么办 一年级孩子上课爱说话怎么办 一年级小孩不听老师话怎么办 大班幼儿规则意识差怎么办 幼儿大班《打雷了怎么办》的教案 小孩上课不听讲到处乱跑怎么办 小孩子经常咬人好动怎么办 6个月宝宝好动怎么办 新生调皮被幼儿园退学怎么办 孩子在幼儿园太调皮怎么办 幼儿上课注意力不集中怎么办 幼儿上课一半要离开怎么办 八个月宝宝消化不良拉肚子怎么办 8个月的宝宝拉肚子怎么办 孕8个月拉稀怎么办 孩子调皮好动爱说话怎么办 宝宝8个月不会爬怎么办 怀孕8个月不想要了怎么办 8个月宝宝发烧怎么办 八个月的小孩发烧怎么办