读书人

跪求关于鼠标全局钩子的有关问题

发布时间: 2012-05-10 16:02:39 作者: rapoo

跪求关于鼠标全局钩子的问题!
我的设计是不管鼠标在哪里点击都能触发鼠标左键事件(WM_LBUTTONDOWN),但现在只能点击主窗口才能有这个信息提示。
都说做成全局钩子就可以了。我也做成全局钩子了还是不行。。
主窗口的代码我就不贴了。我觉得问题就出现在DLL里面。。我再把DLL和主窗口的代码提供出来。。
两个源代码
下载
http://www.51egaow.com/xiazai/mousehook.rar
钩子的DLL

C/C++ code
#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,MouseProc,GetModuleHandle("697"),0);
做全局钩子,你的这个hook代码要放到DLL里,供别的程序使用
http://blog.csdn.net/agoago_2009/article/details/6746361
[解决办法]
设置全局鼠标钩子,用“WH_MOUSE_LL”
C/C++ code
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

读书人网 >VC/MFC

热点推荐