读书人

为何系统钩子只能钩住自己进程的消息?

发布时间: 2012-01-29 21:39:32 作者: rapoo

为何系统钩子只能钩住自己进程的消息?
做了个简单的系统鼠标钩子
但是只有鼠标在我的对话框中才有效~~不知道为什么..
希望达人帮忙!!

我的关键代码如下:

// 共享数据段
#pragma data_seg( ".Hookdata ")
HWND s_hTargetWnd = NULL;
#pragma data_seg()
#pragma comment(linker, "/section:.Hookdata, rws ")

// 需要的全局变量
HINSTANCEg_hModule = NULL;// 实例句柄
HHOOKg_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);
}


[解决办法]
将HINSTANCEg_hModule = NULL;// 实例句柄
HHOOKg_hHook = NULL;// 钩子句柄
也放在共享节里试试.
[解决办法]
// MessageHook.cpp : Defines the entry point for the DLL application.
//

#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的

读书人网 >VC/MFC

热点推荐