鼠标钩子程序初探1

鼠标钩子程序初探1 

对于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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Delphi是一种高级编程语言,它可以通过鼠标钩子来获取和拦截鼠标的事件。鼠标钩子通常被用于跟踪用户的操作,监视用户的行为,或者在游戏中处理鼠标动作。 一般而言,我们可以使用Windows API 来完成鼠标钩子的功能,源码如下: procedure TForm1.FormCreate(Sender: TObject); begin // 安装鼠标钩子 HookMouse; end; procedure TForm1.HookMouse; begin // 获取当前进程的句柄 hCurInst := GetModuleHandle(nil); // 安装鼠标钩子 hHook := SetWindowsHookEx(WH_MOUSE_LL, @MouseHookProc, hCurInst, 0); end; procedure TForm1.UnhookMouse; begin // 卸载鼠标钩子 UnhookWindowsHookEx(hHook); end; function TForm1.MouseHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall; var HookInfo: PMouseHookStruct; begin if (nCode >= 0) and (wParam = WM_MOUSEMOVE) then begin HookInfo := PMouseHookStruct(lParam); // 处理鼠标事件 end; Result := CallNextHookEx(hHook, nCode, wParam, lParam); end; 在代码中,我们使用了SetWindowsHookEx函数来安装鼠标钩子,然后再使用UnhookWindowsHookEx函数来卸载鼠标钩子。在鼠标线程的处理中,我们使用了MouseHookProc函数来处理鼠标事件,它会根据鼠标的动作来执行相应的操作。 总而言之,鼠标钩子是一种很有用的技术,可以被广泛应用于各种领域,无论是用于增强程序的功能,还是用于跟踪和监视用户的操作行为。如果您对此感兴趣的话,可以查看更多相关的资料和代码示例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值