首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

2012-01-29 
为何系统钩子只能钩住自己进程的消息?做了个简单的系统鼠标钩子但是只有鼠标在我的对话框中才有效~~不知道

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

我的关键代码如下:

//   共享数据段
#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的

热点排行