鼠标全局钩子不能全局?

zgzhkyl 2012-08-22 10:20:54
想做一个全局钩子来获取鼠标双击时的点坐标,但程序只在本窗口有效,出了窗口无效,折腾一天了,不解。请大侠帮忙看看代码有什么问题。在vs2010中建立的DLL代码如下:




mousehook.h中的代码:
#include "stdafx.h"
class AFX_EXT_CLASS Cmousehook:public CObject
{
public:
Cmousehook(); //钩子类的构造函数
~Cmousehook(); //钩子类的析构函数
BOOL StartHook(); //安装钩子函数
BOOL StopHook(); //卸载钩子函数
void ReturnPoint(CPoint & pt);
};








mousehook.def中的代码:
; mousehook.def : 声明 DLL 的模块参数。

LIBRARY

EXPORTS
; 此处可以是显式导出

SECTIONS
  mydata READ WRITE SHARED









dllmain.cpp中的代码:
// dllmain.cpp : 定义 DLL 的初始化例程。
//

#include "stdafx.h"
#include <afxwin.h>
#include <afxdllx.h>
#include "mousehook.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

CPoint point;

#pragma data_seg("mydata")
HHOOK glhHook=NULL; //安装的鼠标钩子句柄
HINSTANCE glhInstance=NULL; //DLL实例句柄
#pragma data_seg()

LRESULT WINAPI MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
{
LPMOUSEHOOKSTRUCT pmousehookstruct=(MOUSEHOOKSTRUCT FAR *) lparam;
if (nCode>=0 && wparam==WM_LBUTTONDBLCLK)
{
point=pmousehookstruct->pt;
}
return CallNextHookEx(glhHook,nCode,wparam,lparam);
//继续传递消息
}

static AFX_EXTENSION_MODULE mousehookDLL = { NULL, NULL };

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// 如果使用 lpReserved,请将此移除
UNREFERENCED_PARAMETER(lpReserved);

if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("mousehook.DLL 正在初始化!\n");

// 扩展 DLL 一次性初始化
if (!AfxInitExtensionModule(mousehookDLL, hInstance))
return 0;

// 将此 DLL 插入到资源链中
// 注意: 如果此扩展 DLL 由
// MFC 规则 DLL (如 ActiveX 控件)隐式链接到,
// 而不是由 MFC 应用程序链接到,则需要
// 将此行从 DllMain 中移除并将其放置在一个
// 从此扩展 DLL 导出的单独的函数中。使用此扩展 DLL 的
// 规则 DLL 然后应显式
// 调用该函数以初始化此扩展 DLL。否则,
// CDynLinkLibrary 对象不会附加到
// 规则 DLL 的资源链,并将导致严重的
// 问题。

new CDynLinkLibrary(mousehookDLL);
glhInstance=hInstance;

}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("mousehook.DLL 正在终止!\n");

// 在调用析构函数之前终止该库
AfxTermExtensionModule(mousehookDLL);
}
return 1; // 确定
}

Cmousehook::Cmousehook() //类构造函数
{

}

Cmousehook::~Cmousehook() //类析构函数
{
StopHook();
point.x=point.y=0;
}

BOOL Cmousehook::StartHook() //安装钩子并设定接收显示窗口句柄
{
BOOL bResult=FALSE;
glhHook=SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0);
if(glhHook!=NULL)
bResult=TRUE;
return bResult;
}

BOOL Cmousehook::StopHook()
//卸载钩子
{
BOOL bResult=FALSE;
if(glhHook)
{
bResult= UnhookWindowsHookEx(glhHook);
if(bResult)
{
glhHook=NULL;
}
}
return bResult;
}

void Cmousehook::ReturnPoint(CPoint & pt)
{
pt=point;
}







在基于对话框的程序中使用了上面的DLL,基于对话框程序的BOOL CgetmouseposDlg::OnInitDialog()中添加了一句:
// TODO: 在此添加额外的初始化代码
m_mousehook.StartHook();


按钮的处理函数为:
void CgetmouseposDlg::OnClickedButtonReturnMousePos()
{
// TODO: 在此添加控件通知处理程序代码
CPoint point;
m_mousehook.ReturnPoint(point);
char buffer[40];
wsprintf((LPWSTR)buffer,_T("双击鼠标的位置:(%d,%d)"),point.x,point.y);
this->MessageBox((LPCTSTR)buffer);
}

分不是很多,都给了。
...全文
318 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhxdtnbd 2012-11-27
  • 打赏
  • 举报
回复
引用 5 楼 zgzhkyl 的回复:
问题解决了,不能用CPoint保存点坐标,要在MouseProc函数中向使用DLL的进程发送自定义消息。
你好,我也遇到了相同的问题,请问你是怎么传递的自定义消息?
zgzhkyl 2012-08-23
  • 打赏
  • 举报
回复
问题解决了,不能用CPoint保存点坐标,要在MouseProc函数中向使用DLL的进程发送自定义消息。
sivenyu 2012-08-22
  • 打赏
  • 举报
回复
全局钩子要做成DLL(尚未清楚原因),可以参考一个老外的例子:
http://www.codeproject.com/Articles/1037/Hooks-and-DLLs
Gloveing 2012-08-22
  • 打赏
  • 举报
回复
glhHook=SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0);
最后一个参数是0就代表是安装全局钩子
sivenyu 2012-08-22
  • 打赏
  • 举报
回复
不想看英文就看人家的代码,估计问题出在这里:
glhHook=SetWindowsHookEx(WH_MOUSE,MouseProc,glhInstance,0);
改成:
glhHook=SetWindowsHookEx(WH_GETMESSAGE,MouseProc,glhInstance,0);
zgzhkyl 2012-08-22
  • 打赏
  • 举报
回复
我是初学者,能否说的明白点?英文看起来很费力。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧