首页
社区
课程
招聘
hook线程失败
发表于: 2010-10-16 20:38 4644

hook线程失败

2010-10-16 20:38
4644
下面的DLL文件hook与桌面相关的线程,为什么会失败?会的帮看看,谢谢~_~
#include "stdafx.h"
extern "C"__declspec(dllexport) void sethook();
extern "C"__declspec(dllexport) void stophook();
HINSTANCE hinstance=NULL;
HHOOK hook=NULL;
DWORD ProcessID,ThreadID;
HWND hwnd=NULL;


void deal()
{
	MessageBox(NULL,"test",NULL,0);
}

LRESULT CALLBACK LowLevelMouseProc(
  int nCode,    
  WPARAM wParam, 
  LPARAM lParam
)
{
	if(nCode==HC_ACTION)
	{
		if(wParam==WM_LBUTTONUP)
		{
			deal();
		}
	}
	return CallNextHookEx(hook,nCode,wParam,lParam);
}

void sethook()
{
	if(hook==NULL)
	{
		hwnd=GetDesktopWindow();
		if(hwnd)
		{
			ThreadID=GetWindowThreadProcessId(hwnd,&ProcessID);//获取和桌面窗口关联的线程ID
			if(ThreadID)
				hook=SetWindowsHookEx(WH_MOUSE_LL,(HOOKPROC)LowLevelMouseProc,hinstance,ThreadID);
			else
				MessageBox(NULL,"钩子安装失败!",NULL,0);
		}
		else
		{
			MessageBox(NULL,"钩子安装失败!",NULL,0);
		}
	}
}
void stophook()
{
	if(hook)
		UnhookWindowsHookEx(hook);
}

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
	if(ul_reason_for_call==DLL_PROCESS_ATTACH)
	{
		hinstance=(HINSTANCE)hModule;
		sethook();
	}
	else if(ul_reason_for_call==DLL_PROCESS_DETACH)
	{
		stophook();
	}
    return TRUE;
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
我试了你的 dll 果然失败----SetWindowsHookEx 返回NULL,安装就失败----

后来 查找 MSDN 发现 这个 WH_MOUSE_LL 还比较特殊,它在 鼠标消息 被放入 某个线程消息列队之前 被调用。
(The system call this function every time a new mouse input event is about to be posted into a thread input queue. )

因此 HookProc 应该 不能 知道 这个鼠标消息属于哪个 线程,这个消息 比较 底层吧--
因此它应该 只能 是 全局钩子,不能Hook单一线程。

后来将 SetWindowsHookEx 改成全局的 --- 成功了

后在
MSDN  SetWindowsHookEx 的 下面找到了--果然是啊 --
WH_KEYBOARD               Thread or global
WH_KEYBOARD_LL          Global only
WH_MOUSE_LL               Global only
WH_MSGFILTER              Thread or global
---------------------------
如果监视单一线程的话---- 在 HookProc 里用 WindowFromPoint 获得 此时鼠标 所在窗口--
GetWindowThreadProcessId -获得 dwThreadId -- 再比较,应该可以--
2010-10-17 12:24
0
雪    币: 60
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
下面的DLL文件hook与桌面相关的线程,为什么会失败?会的帮看看,谢谢~_~

代码:
#include "stdafx.h"
extern "C"__declspec(dllexport) void sethook();
extern "C"__declspec(dllexport) void stophook();
HINSTANCE hinstance=NULL;
HHOOK hook=NULL;
DWORD ProcessID,ThreadID;
HWND hwnd=NULL;

void deal()
{
  MessageBox(NULL,"test",NULL,0);
}

LRESULT CALLBACK LowLevelMouseProc(
  int nCode,   
  WPARAM wParam,
  LPARAM lParam
)
{
  if(nCode==HC_ACTION)
  {
    if(wParam==WM_LBUTTONUP)
    {
      deal();
    }
  }
  return CallNextHookEx(hook,nCode,wParam,lParam);
}

void sethook()
{
  if(hook==NULL)
  {
    hwnd=GetDesktopWindow();
    if(hwnd)
    {
      ThreadID=GetWindowThreadProcessId(hwnd,&ProcessID);//获取和桌面窗口关联的线程ID
      if(ThreadID)
        hook=SetWindowsHookEx(WH_MOUSE_LL,(HOOKPROC)LowLevelMouseProc,hinstance,ThreadID);
      else
        MessageBox(NULL,"钩子安装失败!",NULL,0);
    }
    else
    {
      MessageBox(NULL,"钩子安装失败!",NULL,0);
    }
  }
}
void stophook()
{
  if(hook)
    UnhookWindowsHookEx(hook);
}

BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
           )
{
  if(ul_reason_for_call==DLL_PROCESS_ATTACH)
  {
    hinstance=(HINSTANCE)hModule;
    sethook();
  }
  else if(ul_reason_for_call==DLL_PROCESS_DETACH)
  {
    stophook();
  }
    return TRUE;
}
我试了 dll 果然失败----SetWindowsHookEx 返回NULL,安装就失败----

后来 查找 MSDN 发现 这个 WH_MOUSE_LL 还比较特殊,它在 鼠标消息 被放入 某个线程消息列队之前 被调用。
(The system call this function every time a new mouse input event is about to be posted into a thread input queue. )

因此 HookProc 应该 不能 知道 这个鼠标消息属于哪个 线程,这个消息 比较 底层吧--
因此它应该 只能 是 全局钩子,不能Hook单一线程。

后来将 SetWindowsHookEx 改成全局的 --- 成功了

后在
MSDN  SetWindowsHookEx 的 下面找到了--果然是啊 --
WH_KEYBOARD               Thread or global
WH_KEYBOARD_LL          Global only
WH_MOUSE_LL               Global only
WH_MSGFILTER              Thread or global
---------------------------
如果监视单一线程的话---- 在 HookProc 里用 WindowFromPoint 获得 此时鼠标 所在窗口--
GetWindowThreadProcessId -获得 dwThreadId -- 再比较,应该可以--
2010-10-19 14:14
0
雪    币: 21
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢楼上两位了~
2010-10-20 13:24
0
游客
登录 | 注册 方可回帖
返回
//