一个全局钩子dll,但只能接收调用它的程序窗口的消息解决方法
一个全局钩子dll,但只能接收调用它的程序窗口的消息
如题,想获得得鼠标在任意窗口的坐标,写了一个全局的钩子dll,用来响应鼠标移动消息,并把当前坐标用传给主窗口
代码如下:
mouseHook.h文件代码:
__declspec(dllexport)BOOL StartHook(HWND hcaller);
__declspec(dllexport)BOOL EndHook();
mouseHook.cpp文件代码:
#include "stdafx.h"
#include "mouseHook.h"
HINSTANCE hInstance=NULL;
HWND hWndCaller=NULL;
HHOOK hhook=NULL;
#ifdef _MANAGED
#pragma managed(push, off)
#endif
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
hInstance=(HINSTANCE)hModule;
return TRUE;
}
LRESULT CALLBACK MouseHookProc(UINT nCode, WPARAM wParam, LPARAM lParam)
{
if(wParam == WM_MOUSEMOVE) //只处理WM_MOUSEMOVE消息
{
MOUSEHOOKSTRUCT *mhookstruct; //鼠标HOOK结构体
mhookstruct = (MOUSEHOOKSTRUCT*)lParam;
POINT pt = mhookstruct->pt;
PostMessage(hWndCaller,WM_MOUSEMOVE,MK_CONTROL,MAKELPARAM(pt.x,pt.y));
}
return CallNextHookEx(hhook,nCode,wParam,lParam);
}
BOOL StartHook(HWND HWNDCALLER)
{
hWndCaller=HWNDCALLER;
if(!(hhook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseHookProc,hInstance,0)))//
return FALSE;
return TRUE;
}
BOOL EndHook()
{
return UnhookWindowsHookEx(hhook);
}
#ifdef _MANAGED
#pragma managed(pop)
#endif
------解决方案--------------------
把这一段中变量设置为共享数据
#pragma data_seg ("shareddata")
HINSTANCE hInstance=NULL;
HWND hWndCaller=NULL;
HHOOK hhook=NULL;
#pragma data_seg()
------解决方案--------------------
使用WH_MOUSE_LL,不需要用dll
------解决方案--------------------
只需共享hWndCaller
如题,想获得得鼠标在任意窗口的坐标,写了一个全局的钩子dll,用来响应鼠标移动消息,并把当前坐标用传给主窗口
代码如下:
mouseHook.h文件代码:
__declspec(dllexport)BOOL StartHook(HWND hcaller);
__declspec(dllexport)BOOL EndHook();
mouseHook.cpp文件代码:
#include "stdafx.h"
#include "mouseHook.h"
HINSTANCE hInstance=NULL;
HWND hWndCaller=NULL;
HHOOK hhook=NULL;
#ifdef _MANAGED
#pragma managed(push, off)
#endif
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
hInstance=(HINSTANCE)hModule;
return TRUE;
}
LRESULT CALLBACK MouseHookProc(UINT nCode, WPARAM wParam, LPARAM lParam)
{
if(wParam == WM_MOUSEMOVE) //只处理WM_MOUSEMOVE消息
{
MOUSEHOOKSTRUCT *mhookstruct; //鼠标HOOK结构体
mhookstruct = (MOUSEHOOKSTRUCT*)lParam;
POINT pt = mhookstruct->pt;
PostMessage(hWndCaller,WM_MOUSEMOVE,MK_CONTROL,MAKELPARAM(pt.x,pt.y));
}
return CallNextHookEx(hhook,nCode,wParam,lParam);
}
BOOL StartHook(HWND HWNDCALLER)
{
hWndCaller=HWNDCALLER;
if(!(hhook=SetWindowsHookEx(WH_MOUSE,(HOOKPROC)MouseHookProc,hInstance,0)))//
return FALSE;
return TRUE;
}
BOOL EndHook()
{
return UnhookWindowsHookEx(hhook);
}
#ifdef _MANAGED
#pragma managed(pop)
#endif
------解决方案--------------------
把这一段中变量设置为共享数据
#pragma data_seg ("shareddata")
HINSTANCE hInstance=NULL;
HWND hWndCaller=NULL;
HHOOK hhook=NULL;
#pragma data_seg()
------解决方案--------------------
使用WH_MOUSE_LL,不需要用dll
------解决方案--------------------
只需共享hWndCaller