这个示例程序使用全局挂接函数。 程序分为两个部分:可执行程序MouseDemo和动态连接库
MouseHook。 首先创建MFC扩展动态连接库MouseHook.dll:
(一)选择MFCappwizard ) dll )创建项目Mousehook;
(二)选择MFCextensiondll )类型;
(三)通过项目菜单的AddToProject子菜单的“New…”添加头文件MouseHook.h。
(四)在头文件中制作挂钩类:
class afx _ ext _ class c mouse hook :公共对象
{
公共:
CMouseHook (; //钩类构造函数
~CMouseHook (; //挂钩类析构函数
蓝牙(hwnd hwnd ); //安装挂接函数
BOOL StopHook (; //卸载挂接函数
(;
(五)在MouseHook.cpp文件中添加#include'MouseHook.h '语句;
(六)参与全局共享数据变量:
#pragmadata_seg('mydata ' ) ) ) )。
HWND glhPrevTarWnd=NULL; //上次用鼠标指定的窗口句柄
HWND glhDisplayWnd=NULL; //显示目标窗口标题编辑框的句柄
HHOOK glhHook=NULL; //已安装鼠标的检查句柄
hinstance glh instance=空值; //DLL实例句柄
#pragma data_seg ()
(七)在DEF文件中定义段属性:
第二阶段
我的数据读写共享
(八)在主文件MouseHook.cpp的DllMain函数中添加保存DLL实例句柄的语句:
satic afx _ extension _ modulemousehookdll={ null,NULL };
扩展应用程序
dl main (高性能,DWORD dwReason,LPVOID lpReserved ) )。
{
统一参数(lpreserved;
if (dw reason==dll _ process _ attach ) )。
{
if (! afxinitextensionmodule (mouse hook dll,hInstance ) )
返回0;
newcdynlinklibrary (mouse hook dll;
glh实例=hinstance; 插入并保存//dll实例句柄
}
else if (dw reason==dll _ process _ detach ) ) ) )。
{
afxtermextensionmodule (mouse hook dll;
}
返回1; //ok
}
此函数的最重要部分是调用AfxInitExtensionModule (),将DLL初始化并放入MFC框架中
正确的工作。 DllMain (需要传递给的DLL实例句柄和AFX_EXTENSION_MODULE
结构,结构中有对MFC有用的信息。
(九)类CMouseHook成员函数的具体实现:
cmousehook :3360 cmousehook//类构造函数
{
}
cmousehook :3360~cmousehook (//类析构函数
{
停止hook (;
}
安装boolcmousehook :3360 start hook (hwnd hwnd )//挂钩,设置接收显示窗口句柄
{
BOOL bResult=FALSE;
glh hook=setwindowshookex (wh _ mouse,MouseProc,glhInstance,0 );
if(GlhHook!=NULL )
bResult=TRUE;
glhDisplayWnd=hWnd; //设置目标窗口标题编辑框的句柄
返回结果;
}
boolcmousehook :3360 stop hook ()//摘钩
{
BOOL bResult=FALSE;
if(glhhook ) ) )。
{
bresult=unhookwindowshookex;
是if(bresult )
{
glhPrevTarWnd=NULL;
glhDisplayWnd=NULL; //清变量
glhHook=NULL;
}
}
返回结果;
}
(十)钩子函数的实现
Lesultwinapimouseproc(intncode、WPARAM wparam、LPARAM lparam ) )。
{
lpmousehookstructpmousehook=(mousehookstructfar * ) lparam;
if(ncode=0) )
{
hwndglhtargetwnd=pmousehook-hwnd; //获取目标窗口的句柄
HWND ParentWnd=glhTargetWnd;
wile(Parentwnd!=NULL )
{
glhTargetWnd=ParentWnd;
parent wnd=get parent (glhtargetwnd; //获取APP应用程序主窗口句柄
}
If (千兆网!=glhPrevTarWnd )
{
char szCaption[100];
获取窗口文本(glhtargetwnd,szCaption,100 ); //获取目标窗口的标题
if (is窗口(glhdisplaywnd ) )
sendmessage(glhdisplaywnd,WM_SETTEXT,0,) LPARAM ) ) LPCTSTR ) szCaption;
glhPrevTarWnd=glhTargetWnd; //保存位置窗口
}
}
returncallnexthookex(glhhook,nCode,wparam,lparam ); //继续发送信息
}
编译完成后,您将获得运行时所需的鼠标挂接动态连接库MouseHook.dll和链接
MouseHook.lib
现在创建一个调用鼠标挂接动态连接库的挂接可执行程序。
(一)在MFC的应用程序向导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.start hook (pwnd-getsafehwnd (); //获取编辑框的窗口手柄并安装挂钩
(七)在头文件CMouseDemoDlg.h中添加#pragmacomment ) lib、' mousehook.lib '
(八)将MouseHook.h和MouseHook.lib复制到MouseDemo项目目录,MouseHook.dll
复制到调试目录。 编译程序就可以了。 当鼠标悬停在窗口上时,编辑框将显示窗口的
将显示标题。