c 语言鼠标钩子,鼠标钩子程序示例

本示例程序用到全局钩子函数,程序分两部分:可执行程序 MouseDemo 和动态连接库

MouseHook。首先编制 MFC 扩展动态连接库 MouseHook.dll:

(一)选择 MFC AppWizard(DLL)创建项目 Mousehook;

(二)选择 MFC Extension DLL(MFC 扩展 DLL)类型;

(三)通过 Project 菜单的 AddToProject 子菜单的"New…"添加头文件 MouseHook.h。

(四)在头文件中建立钩子类:

class AFX_EXT_CLASS CMouseHook:public CObject

{

public:

CMouseHook(); //钩子类的构造函数

~CMouseHook(); //钩子类的析构函数

BOOL StartHook(HWND hWnd); //安装钩子函数

BOOL StopHook(); //卸载钩子函数

};

(五)在 MouseHook.cpp 文件中加入#include"MouseHook.h"语句;

(六)加入全局共享数据变量:

#pragma data_seg("mydata")

HWND glhPrevTarWnd=NULL; //上次鼠标所指的窗口句柄

HWND glhDisplayWnd=NULL; //显示目标窗口标题编辑框的句柄

HHOOK glhHook=NULL; //安装的鼠标勾子句柄

HINSTANCE glhInstance=NULL; //DLL 实例句柄

#pragma data_seg()

(七)在 DEF 文件中定义段属性:

SECTIONS

mydata READ WRITE SHARED

(八)在主文件 MouseHook.cpp 的 DllMain 函数中加入保存 DLL 实例句柄的语句:

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)

{

if (!AfxInitExtensionModule(mousehookDLL, hInstance))

return 0;

new CDynLinkLibrary(mousehookDLL);

glhInstance=hInstance; //插入保存 DLL 实例句柄

}

else if (dwReason == DLL_PROCESS_DETACH)

{

AfxTermExtensionModule(mousehookDLL);

}

return 1; // ok

}

这个函数最重要的部分是调用 AfxInitExtensionModule(),它初始化 DLL 使它在 MFC 框架

中正确的工作。它需要传递给 DllMain()的 DLL 实例句柄和 AFX_EXTENSION_MODULE

结构,结构中存在着对 MFC 有用的信息。

(九) 类 CMouseHook 的成员函数的具体实现:

CMouseHook::CMouseHook() //类构造函数

{

}

CMouseHook::~CMouseHook() //类析构函数

{

StopHook();

}

BOOL CMouseHook::StartHook(HWND hWnd) //安装钩子并设定接收显示窗口句柄

{

BOOL bResult=FALSE;

glhHook=SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0);

if(glhHook!=NULL)

bResult=TRUE;

glhDisplayWnd=hWnd; //设置显示目标窗口标题编辑框的句柄

return bResult;

}

BOOL CMouseHook::StopHook() //卸载钩子

{

BOOL bResult=FALSE;

if(glhHook)

{

bResult= UnhookWindowsHookEx(glhHook);

if(bResult)

{

glhPrevTarWnd=NULL;

glhDisplayWnd=NULL;//清变量

glhHook=NULL;

}

}

return bResult;

}

(十) 钩子函数的实现

LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)

{

LPMOUSEHOOKSTRUCT pMouseHook=(MOUSEHOOKSTRUCT FAR *) lparam;

if (nCode>=0)

{

HWND glhTargetWnd=pMouseHook->hwnd; //取目标窗口句柄

HWND ParentWnd=glhTargetWnd;

while (ParentWnd !=NULL)

{

glhTargetWnd=ParentWnd;

ParentWnd=GetParent(glhTargetWnd); //取应用程序主窗口句柄

}

if(glhTargetWnd!=glhPrevTarWnd)

{

char szCaption[100];

GetWindowText(glhTargetWnd,szCaption,100); //取目标窗口标题

if(IsWindow(glhDisplayWnd))

SendMessage(glhDisplayWnd,WM_SETTEXT,0,(LPARAM)(LPCTSTR)szCaption);

glhPrevTarWnd=glhTargetWnd; //保存目标窗口

}

}

return CallNextHookEx(glhHook,nCode,wparam,lparam); //继续传递消息

}

编译完成便可得到运行时所需的鼠标钩子的动态连接库 MouseHook.dll 和链接时用到的

MouseHook.lib

下面新建一调用鼠标钩子动态连接库的钩子可执行程序:

(一) 用 MFC 的 AppWizard(EXE)创建项目 MouseDemo;

(二) 选择"基于对话应用",其余几步均为确省;

(三) 在对话框上加入一个编辑框 IDC_EDIT1;

(四) 在 MouseDemo.h 中加入对 Mousehook.h 的包含语句:#Include"Mousehook.h";

(五) 在 CMouseDemoDlg.h 的 CMouseDemoDlg 类定义中添加私有数据成员:

CMouseHook m_hook;

(六) 在 OnInitDialog 函数的"TODO 注释"后添加:

CWnd * pwnd=GetDlgItem(IDC_EDIT1); //取得编辑框的类指针

m_hook.StartHook(pwnd->GetSafeHwnd()); //取得编辑框的窗口句柄并安装钩子

(七)在头文件CMouseDemoDlg.h中增加#pragma comment(lib,"mousehook.lib")

(八)把 MouseHook.h 和 MouseHook.lib 复制到 MouseDemo 工程目录中,MouseHook.dll

复制到 Debug 目录下。编译执行程序即可。当鼠标滑过窗口时便会在编辑框中将此窗口的

标题显示出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值