做了个简单的系统鼠标钩子
但是只有鼠标在我的对话框中才有效~~不知道为什么..
希望达人帮忙!!我的关键代码如下:// 共享数据段
#pragma data_seg(".Hookdata")
HWND s_hTargetWnd = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.Hookdata, rws")// 需要的全局变量
HINSTANCE g_hModule = NULL; // 实例句柄
HHOOK g_hHook = NULL; // 钩子句柄BOOL APIENTRY DllMain( HINSTANCE hModule,
DWORD ul_reason_for_call,
LPVOID /*lpReserved*/
)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
g_hModule = hModule;
}
else if (ul_reason_for_call == DLL_PROCESS_DETACH)
{
if (g_hHook != NULL)
::UnhookWindowsHookEx(g_hHook);
} return TRUE;
}static LRESULT CALLBACK MyMouseProc(int iCode, WPARAM wParam, LPARAM lParam)
{
do
{
if (iCode < 0)
break; MSG msg = *((LPMSG)lParam);
switch (msg.message)
{
case WM_LBUTTONDOWN:
::SendMessage(s_hTargetWnd, WM_HOOKMOUSE, WM_SUB_LBTN, 0);
break;
case WM_RBUTTONDOWN:
::SendMessage(s_hTargetWnd, WM_HOOKMOUSE, WM_SUB_RBTN, 0);
break;
default: break;
}
} while(FALSE); return ::CallNextHookEx(g_hHook, iCode, wParam, lParam);
}// 鼠标钩子类
//
// 安装钩子
BOOL CMouseHook::Start()
{
// g_hHook = ::SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MyMouseProc, g_hModule, 0);
g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MyMouseProc, g_hModule, 0);
if (g_hHook == NULL)
return FALSE; return TRUE;
}// 卸载钩子
BOOL CMouseHook::Stop()
{
return ::UnhookWindowsHookEx(g_hHook);
}
但是只有鼠标在我的对话框中才有效~~不知道为什么..
希望达人帮忙!!我的关键代码如下:// 共享数据段
#pragma data_seg(".Hookdata")
HWND s_hTargetWnd = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.Hookdata, rws")// 需要的全局变量
HINSTANCE g_hModule = NULL; // 实例句柄
HHOOK g_hHook = NULL; // 钩子句柄BOOL APIENTRY DllMain( HINSTANCE hModule,
DWORD ul_reason_for_call,
LPVOID /*lpReserved*/
)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
g_hModule = hModule;
}
else if (ul_reason_for_call == DLL_PROCESS_DETACH)
{
if (g_hHook != NULL)
::UnhookWindowsHookEx(g_hHook);
} return TRUE;
}static LRESULT CALLBACK MyMouseProc(int iCode, WPARAM wParam, LPARAM lParam)
{
do
{
if (iCode < 0)
break; MSG msg = *((LPMSG)lParam);
switch (msg.message)
{
case WM_LBUTTONDOWN:
::SendMessage(s_hTargetWnd, WM_HOOKMOUSE, WM_SUB_LBTN, 0);
break;
case WM_RBUTTONDOWN:
::SendMessage(s_hTargetWnd, WM_HOOKMOUSE, WM_SUB_RBTN, 0);
break;
default: break;
}
} while(FALSE); return ::CallNextHookEx(g_hHook, iCode, wParam, lParam);
}// 鼠标钩子类
//
// 安装钩子
BOOL CMouseHook::Start()
{
// g_hHook = ::SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MyMouseProc, g_hModule, 0);
g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MyMouseProc, g_hModule, 0);
if (g_hHook == NULL)
return FALSE; return TRUE;
}// 卸载钩子
BOOL CMouseHook::Stop()
{
return ::UnhookWindowsHookEx(g_hHook);
}
我贴的接是dll的代码
---------------------------------------------------------问题描述清楚点
我贴的代码是DLL中的
我会导出CMouseHook类和一个设置s_hTargetWnd的函数SetTargetWnd然后还有个对话框程序,里面有CMouseHook类型的成员变量
在对话框初始化时先调用SetTargetWnd来设置窗口句柄
然后有两个按扭分别调用CMouseHook::Start() 和 CMouseHook::Stop()调用Start后,只有鼠标在该对话框中才能钩住,其他地方根本就不会进入我的MyMouseProc
实例句柄应该是这样设的
HHOOKg_hHook = NULL;// 钩子句柄
也放在共享节里试试.
是头文件的问题吗?请高手们说说全局钩子应注意哪些问题?
还有些什么东西需要设置?
我已经完全按照网上的教程做了,还是有问题.我搞了好几天了,都没有找到错误的原因,郁闷哪!!~~~
放在共享段也不行~~
不过,我现在的问题是根本就不能进MyMouseProc,也就是根本就到不了SendMessage这里
我把我的整个代码给你看看如何?
这不是关键问题~~~~
case WM_RBUTTONDOWN:
::PostMessage(s_hTargetWnd, WM_HOOKMOUSE, WM_SUB_RBTN, 0);
MessageBox(NULL,"kKKK","ppp",MB_OK);
发现,别的进程中的消息还是被钩住了,只是PostMessage过去的消息没反应,这个函数也没有返回错误.
1.cpp
#define _WIN32_WINNT 0x0500
#include "windows.h"
#include "1.h"
#include "stdio.h"
#pragma data_seg("Shared")
HHOOK hook=NULL;
HINSTANCE hMod=NULL;
HWND hwnd=NULL;
#pragma data_seg()
#pragma comment(linker,"/Section:Shared,RWS")int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
hMod=hInstance;
return TRUE ;
}
EXPORT VOID CALLBACK InstallHook()
{
hook=SetWindowsHookEx(WH_GETMESSAGE,MouseProc,hMod,0);
if(hwnd==NULL)
hwnd=FindWindow(NULL,"MouseHookMain");}
EXPORT LRESULT CALLBACK MouseProc(int code,WPARAM wParam,LPARAM lParam )
{
MSG *pMsg;
pMsg=(MSG *)lParam;
if(pMsg->message==WM_RBUTTONDOWN)
{
::PostMessage(hwnd,WM_MOUSE_USER,WM_MOUSE_RUSER,lParam);
}
if(pMsg->message==WM_LBUTTONDOWN)
{
::PostMessage(hwnd,WM_MOUSE_USER,WM_MOUSE_LUSER,lParam);
}
return CallNextHookEx(hook,code,wParam,lParam);
}
EXPORT VOID CALLBACK UnInstall()
{
UnhookWindowsHookEx(hook);
hwnd=NULL;
}
1.h
#ifdef __cplusplus
#define EXPORT extern "C" __declspec (dllexport)
#else
#define EXPORT __declspec (dllexport)
#endif
#define WM_MOUSE_USER WM_USER+5
#define WM_MOUSE_LUSER WM_USER+6
#define WM_MOUSE_RUSER WM_USER+7
EXPORT LRESULT CALLBACK MouseProc(int code,WPARAM wParam,LPARAM lParam);
EXPORT VOID CALLBACK InstallHook();
EXPORT VOID CALLBACK UnInstall();
应该是::PostMessage(s_hTargetWnd,WM_MOUSE_USER,WM_MOUSE_RUSER,lParam);吧
别个进程不用做出反应,我只要钩住别个进程的鼠标消息而已~~~~但是就是钩不住~
//#include "stdafx.h"
#include "../HookTest/HookMessage.h"#pragma data_seg("Hookdata")
HWND s_hTargetWnd = NULL;
HINSTANCE g_hModule = NULL;
HHOOK g_hHook = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:Hookdata,RWS")#ifdef _MANAGED
#pragma managed(push, off)
#endif
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
if (ul_reason_for_call == DLL_PROCESS_ATTACH)
{
g_hModule = hModule;
}
else if (ul_reason_for_call == DLL_PROCESS_DETACH)
{
if (g_hHook != NULL)
::UnhookWindowsHookEx(g_hHook);
}
return TRUE;
}LRESULT CALLBACK MyMouseProc(int iCode, WPARAM wParam, LPARAM lParam)
{
do
{
if (iCode < 0)
break; MSG msg = *((LPMSG)lParam);
switch (msg.message)
{
case WM_LBUTTONDOWN:
::SendMessage(s_hTargetWnd, WM_HOOKMOUSE, WM_SUB_LBTN, 0);
break;
case WM_RBUTTONDOWN:
::SendMessage(s_hTargetWnd, WM_HOOKMOUSE, WM_SUB_RBTN, 0);
break;
default: break;
}
} while(FALSE); return ::CallNextHookEx(g_hHook, iCode, wParam, lParam);
}BOOL _declspec(dllexport) StartHook(HWND _hMonitor)
{
s_hTargetWnd = _hMonitor;
g_hHook = ::SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MyMouseProc, g_hModule, 0);
if (g_hHook == NULL)
return FALSE; return TRUE;
}我稍微改了点东西,可以hook的
真是晕死!!!!!
结帖