您的位置:首页 > 其它

鼠标全局钩子

2009-05-23 16:21 134 查看
最近看一个老兄写的一个鼠标的全局钩子,感觉其代码有点过多繁琐,于是就自己改写了一下。发现学到不少的知识,特拿来分享!

本程序分为两个部分:

第一:dll部分。

第二:程序部分。

本程序是主要获得任意窗口的标题。

第一部分代码如下:

#include <windows.h>

#pragma data_seg("mydata")
HWND g_hPrevTarWnd = NULL;
//上次鼠标所指的窗口句柄
HWND g_hDisplayWnd = NULL;
//显示目标窗口标题编辑框的句柄
HHOOK g_hHook = NULL; //安装的鼠标勾子句柄
#pragma data_seg()
#pragma comment(linker,"/section:mydata,rws")
//实现数据共享

//钩子函数的实现:
LRESULT CALLBACK MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
{
LPMOUSEHOOKSTRUCT pMouseHook =
(MOUSEHOOKSTRUCT FAR *)lparam;
if (nCode >= 0)
{
HWND glhTargetWnd =
::WindowFromPoint(pMouseHook->pt);
if ((glhTargetWnd != g_hPrevTarWnd) &&
(NULL != glhTargetWnd))
{
char szCaption[256];
GetWindowText(glhTargetWnd,szCaption,100);
//取目标窗口标题

if(IsWindow(g_hDisplayWnd))
{
SendMessage(g_hDisplayWnd,WM_SETTEXT,0,  (LPARAM)(LPCTSTR)szCaption);
}
g_hPrevTarWnd=glhTargetWnd;//保存目标窗口
}
}
return CallNextHookEx(g_hHook,nCode,wparam,lparam);
//继续传递消息
}

//启动钩子
_declspec(dllexport) void StartHook(HWND hWnd)
{
g_hHook = SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("Hook"),0);
//全局钩子最后一个函数要为零

g_hDisplayWnd = hWnd;
}

//卸载钩子
_declspec(dllexport) void StopHook()
{
BOOL bResult;
bResult = UnhookWindowsHookEx(g_hHook);
if(bResult)
{
g_hPrevTarWnd = NULL;
g_hDisplayWnd = NULL;
g_hHook = NULL;
}
}


第二部分主要代码:

建立一个基于对话框的应用程序,然后在OnInitDialog函数里面添加启动钩子函数,具体代码:

// TODO: Add extra initialization here

CWnd* pWnd=GetDlgItem(IDC_HOOkEDIT);
StartHook(pWnd->GetSafeHwnd());


分别添加卸载钩子和取消的按钮命令,代码如下:

void CHookTestDlg::OnStophook()
{
// TODO: Add your control notification handler code here
StopHook();
GetDlgItem(IDC_STOPHOOK)->EnableWindow(FALSE);

}

void CHookTestDlg::OnCancel()
{
// TODO: Add extra cleanup here

StopHook();
CDialog::OnCancel();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: