鼠标全局钩子不能全局?
想做一个全局钩子来获取鼠标双击时的点坐标,但程序只在本窗口有效,出了窗口无效,折腾一天了,不解。请大侠帮忙看看代码有什么问题。在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);
}
分不是很多,都给了。