| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 464 人关注过本帖
标题:[求助]关于全局钩子和线程钩子的问题
收藏  订阅  推荐  打印 
圆圆的鸟蛋
Rank: 3Rank: 3
等级:中级会员
帖子:216
积分:2288
注册:2007-4-22
[求助]关于全局钩子和线程钩子的问题

小弟在一个DLL文件中有如下代码:

//hWin是在CPP文件中已经获得的窗口句柄
void SetHook(HWND hWin)
{
……
ThisDllName = GetModuleHandle("Find.dll") ;
ThreadId = GetWindowThreadProcessId(hWin, NULL) ;
h_hBut = SetWindowsHookEx(WH_CALLWNDPROC, KeyFunc, ThisDllName, 0) ; //*
……
}

LRESULT CALLBACK KeyFunc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(wParam == VK_RETURN)
{
MessageBox("hello") ;
}
return CallNextHookEx(h_hBut, nCode, wParam, lParam) ;
}

此时运行程序,一切正常,按下“回车”之后,弹出对话框。
但因为不需要全局钩子,于是我将*号(红色的那句)最后一个参数改为:ThreadId ,但此时再运行时,按下“回车”却没有反应了。。查过MSDN后自己觉得GetWindowThreadProcessId函数的用法应该没错(我英语很错菜)。小弟实在不知这是为什么,请各位大虾帮帮忙。多谢了!!

搜索更多相关主题的帖子: 线程  钩子  全局  
2007-7-30 00:18
余来
Rank: 12Rank: 12Rank: 12
等级:版主
威望:25
帖子:954
积分:10248
注册:2006-8-13

线程获取错误,应该用
GetCurrentThreadID()函数,获取当前线程ID,最好是在主程序中获取线程ID

然后在设置HOOOK的时候,将线程D传入到DLL中,再在
SetWindowsHookEx时候,最后一个参数使用传入到DLL中的线程ID

不过如果不是全局的话,应该可以将HOOK放到程序内部比较方便。当然放到DLL中,方便以后修改成全局的拉。呵呵

2007-7-30 10:19
medicihophy
Rank: 2
等级:注册会员
威望:1
帖子:102
积分:1120
注册:2007-7-28

GetWindowThreadProcessId(

HWND hWnd,

LPDWORD lpdwProcessId);

LPDWORD lpdwProcessId为空,这个函数的功能就是使用进程标识符而取得进程PID的句柄嘛,你没写怎么回返回
它的PID呢?


2007-7-30 10:25
medicihophy
Rank: 2
等级:注册会员
威望:1
帖子:102
积分:1120
注册:2007-7-28

我说错了,我也不太懂呵呵!!!

2007-7-30 10:27
圆圆的鸟蛋
Rank: 3Rank: 3
等级:中级会员
帖子:216
积分:2288
注册:2007-4-22

以下是引用余来在2007-7-30 10:19:55的发言:
线程获取错误,应该用
GetCurrentThreadID()函数,获取当前线程ID,最好是在主程序中获取线程ID

然后在设置HOOOK的时候,将线程D传入到DLL中,再在
SetWindowsHookEx时候,最后一个参数使用传入到DLL中的线程ID

不过如果不是全局的话,应该可以将HOOK放到程序内部比较方便。当然放到DLL中,方便以后修改成全局的拉。呵呵

线程获取错误,应该用GetCurrentThreadID()函数,获取当前线程ID??
我并不需要当前线程阿!! 我要获得的是另一个程序的线程,所以用的是GetWindowThreadProcessId函数。


鸟蛋开始孵化。。。我等待那一天Forever。。
2007-8-1 02:39
余来
Rank: 12Rank: 12Rank: 12
等级:版主
威望:25
帖子:954
积分:10248
注册:2006-8-13

这样使用
DWORD ID;
GetWindowThreadProcessId(窗口句丙,&ID);
其中ID就是要获取到的进程ID


2007-8-1 16:01
圆圆的鸟蛋
Rank: 3Rank: 3
等级:中级会员
帖子:216
积分:2288
注册:2007-4-22

改了,还是没反应!!晕死我了

鸟蛋开始孵化。。。我等待那一天Forever。。
2007-8-2 13:02
whayne
Rank: 1
等级:新手上路
帖子:1
积分:110
注册:2007-8-5

检查一下hwnd是否正确,传错的话当然是没有反应的。

2007-8-5 12:27
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 2.411606 second(s), 9 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved