为何系统钩子只能钩住自己进程的消息?
做了个简单的系统鼠标钩子
但是只有鼠标在我的对话框中才有效~~不知道为什么..
希望达人帮忙!!
我的关键代码如下:
// 共享数据段
#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的