跪求关于鼠标全局钩子的问题!
我的设计是不管鼠标在哪里点击都能触发鼠标左键事件(WM_LBUTTONDOWN),但现在只能点击主窗口才能有这个信息提示。
都说做成全局钩子就可以了。我也做成全局钩子了还是不行。。
主窗口的代码我就不贴了。我觉得问题就出现在DLL里面。。我再把DLL和主窗口的代码提供出来。。
两个源代码
下载
http://www.51egaow.com/xiazai/mousehook.rar
钩子的DLL
#include "windows.h"#define HM_MOUSE WM_USER +102 //自定义鼠标消息 HHOOK g_hMouse = NULL;HWND g_hWndCaller = NULL; // 保存主窗口句柄 UINT n_Count = 0;LRESULT CALLBACK MouseProc(int nCode,WPARAM wparam,LPARAM lparam){ if (nCode == HC_NOREMOVE) { // 如果是滚动滑轮,弹出消息框,卸载钩子函数 if (wparam == WM_LBUTTONDOWN) { //::SendMessage(g_hWndCaller, HM_MOUSE, (WPARAM)n_Count, 0); ::SendMessage(g_hWndCaller, WM_LBUTTONDOWN, 0, 0); } } return CallNextHookEx(g_hMouse, nCode, wparam, lparam); //return 1;}void SetHook(HWND hWndCaller){ g_hWndCaller = hWndCaller;//赋值给全局 g_hMouse = SetWindowsHookEx(WH_MOUSE,MouseProc,GetModuleHandle("697"),0);}void StopHook(){ if( UnhookWindowsHookEx(g_hMouse)) MessageBox(NULL,"成功","tishi",MB_OK);}g_hMouse = SetWindowsHookEx(WH_MOUSE_LL,MouseProc,GetModuleHandle("697"),0);
[解决办法]
HHOOK g_hMouse = NULL;
这个要放在共享内存中。
[解决办法]
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0400
#endif
#include "windows.h"
#define HM_MOUSE WM_USER +102 //自定义鼠标消息
#pragma data_seg("mydata")
HHOOK g_hMouse = NULL;
HWND g_hWndCaller = NULL; // 保存主窗口句柄
UINT n_Count = 0;
#pragma data_seg()
LRESULT CALLBACK MouseProc(int nCode,WPARAM wparam,LPARAM lparam)
{
if (nCode == HC_NOREMOVE)
{
// 如果是滚动滑轮,弹出消息框,卸载钩子函数
if (wparam == WM_LBUTTONDOWN)
{
//::SendMessage(g_hWndCaller, HM_MOUSE, (WPARAM)n_Count, 0);
::SendMessage(g_hWndCaller, WM_LBUTTONDOWN, 0, 0);
}
}
else if(nCode == HC_ACTION)
{
if (wparam == WM_LBUTTONDOWN)
{
n_Count++;
//::SendMessage(g_hWndCaller, WM_LBUTTONDOWN, (WPARAM)n_Count, 0);
//::SendMessage(g_hWndCaller, WM_LBUTTONDOWN, 0, 0);
OutputDebugString(("WM_KEYDOWN processed\n"));//+n_Count
}
}
return CallNextHookEx(g_hMouse, nCode, wparam, lparam);
//return 1;
}
void SetHook(HWND hWndCaller)
{
g_hWndCaller = hWndCaller;//赋值给全局 WH_MOUSE
//HMODULE Handle=GetModuleHandle(("697.dll"));
g_hMouse = SetWindowsHookEx(WH_MOUSE_LL,MouseProc,GetModuleHandle(("697.dll")),0);
}
void StopHook()
{
if( UnhookWindowsHookEx(g_hMouse))
MessageBox(NULL,"成功","tishi",MB_OK);
}
[解决办法]
g_hWndCaller 需要dll共享,否则其他进程加载697.dll时将重新分配g_hWndCaller。
所以点击其他进程窗口时::SendMessage(g_hWndCaller, WM_LBUTTONDOWN, 0, 0)不能发送到hWndCaller,因为g_hWndCaller并非SetHook(HWND hWndCaller)的hWndCaller