现在在我自己的进程里面,我创建了一个线程,在这个线程里面使用
SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, NULL, GetCurrentThreadId());
设置了一个键盘钩子。
我想问的问题是:钩子的作用范围是当前的线程(见上面的GetCurrentThreadId()),是不是只要这个线程存在,所以的当前进程的键盘消息都会被我hook住呢?
另外,我的这个线程被我结束了,钩子也同时失去作用了(不是因为我使用了UnHook函数,而是因为线程没有了),怎么才能使我的钩子在当前进程内有效,不论创建钩子的线程是否终结呢?
不要使用全局钩子啊,我只希望我的钩子在当前进程有效,也别告诉我必须在主线程创建啊,我必须在另外一个线程里面创建啊:)原因比较特殊,可以参见我的另外一个问题:
http://expert.csdn.net/Expert/topic/2666/2666477.xml?temp=.3817713
SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, NULL, GetCurrentThreadId());
设置了一个键盘钩子。
我想问的问题是:钩子的作用范围是当前的线程(见上面的GetCurrentThreadId()),是不是只要这个线程存在,所以的当前进程的键盘消息都会被我hook住呢?
另外,我的这个线程被我结束了,钩子也同时失去作用了(不是因为我使用了UnHook函数,而是因为线程没有了),怎么才能使我的钩子在当前进程内有效,不论创建钩子的线程是否终结呢?
不要使用全局钩子啊,我只希望我的钩子在当前进程有效,也别告诉我必须在主线程创建啊,我必须在另外一个线程里面创建啊:)原因比较特殊,可以参见我的另外一个问题:
http://expert.csdn.net/Expert/topic/2666/2666477.xml?temp=.3817713
解决方案 »
- 一个按钮执行函数过程中经常出现卡,停顿现象,求解!
- 不懂就问:NULL_BRUSH 空刷子的作用是什么
- 怎样让切分的视图动态调整大小以适应当前窗口大小?
- 如何实现编辑框对鼠标左键双击事件的响应?
- 如何在VCc程序里作统计图(柄状图、条形图等)
- 如何根据代码页的描述得知代码页的编号Code-Page Identifiers?
- 大家讨论:static使用及注意事项
- 系统分析员报考者的呼声和心理感受写真----------- 致中软考指导委员会与出题组
- 从CButton继承的按钮如何能够截获WM_IME_NOTIFY消息?
- popup窗口隐藏时,刷新整个程序
- 申请数据库版版主,希望大家支持
- 如何通过ole的形式访问html的内容?可以马上结贴!
这个问题不解决了不甘心啊
另外问一下,如果我是用SetWindowLong来改变window的回调函数,处理其中的键盘消息,是不是和键盘钩子差不多呢?
我觉得应该不一样啊。
fzd999(花差花差) :
http://expert.csdn.net/Expert/topic/2666/2666477.xml?temp=.3817713,看看这里,其实是通过CreateRemoteProcess创建的,我的线程函数实际上是LoadLibrary,参数是我要load的dll地址,所以没有你说的lParam,而且我也没有能力来传这个lParam。
kinghawk(惊鸿):只找到一个GetWindowThreadProcessId,这个要有窗口才成啊,我创建这个线程的时候还没有创建窗口啊!
-------------------------------------
确实我可以知道,但这样要自己写回调函数很麻烦啊,我调试没有成功,我想看能不能在loadlibrary的时候让函数自己从dllmain中完成,这样很好调试啊,难道真的没有办法得到主线程了?
另:GR(永远问问题):
我从没有说这个函数是用来判断主线程的,我一再强调第一个参数应该是主进程的句柄,而且楼主现在需要的也是主线程ID。
所以GetWindowThreadProcessId感觉我无法得到我想要的参数!
当然,挂到宿主进程的其他线程上也是可以的.另外,kinghawk(惊鸿) ( ) 的关于主进程的句柄这种说法我不太了解,虚心请教一下
我从没有说这个函数是用来判断主线程的,我一再强调第一个参数应该是主进程的句柄,而且楼主现在需要的也是主线程ID。
那我试试
GetWindowThreadProcessId(GetCurrentProcess,NULL);
这样来指定线程是不行的啊!
HANDLE hSnapShot;
THREADENTRY32 te;
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, GetCurrentProcessId());
然后用
Thread32First和Thread32Next来枚举线程
不知道怎么才能枚举完啊?
msdn里面找不到这个结构啊!
{
if(dwCurProcId == te.th32OwnerProcessID)
{
hHook = SetHook(WH_KEYBOARD, (HOOKPROC)KeyboardProc, NULL, te.th32ThreadID);
}
}
怎么这样还是hook不了所有的线程呢?
HANDLE hSnapShot;
THREADENTRY32 te;
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
BOOL bOK = Thread32First(hSnapShot, &te);
一直都是FALSE啊
这是怎么回事啊?
是忘了这个
te.dwSize = sizeof(THREADENTRY32);
但是现在怎么还是不行啊!
太郁闷了啊!
键盘钩子要显示的对话框一闪就消失了啊,真是很奇怪啊!
我的对话框显示程序是这样的
if(ShowWindow(hwndMain, SW_SHOW)) //切换显示状态
{
ShowWindow(hwndMain, SW_HIDE);
}
因为用了一个线程来加载,所以当前程序有两个线程,所以按了键盘钩子设定的键之后,一个线程使它显示,一个线程使它消失,前面也说了,我是对当前进程的每个线程设了键盘钩子的
for(BOOL bOK = Thread32First(hSnapShot, &te); bOK; bOK = Thread32Next(hSnapShot, &te))
{
if(dwCurProcId == te.th32OwnerProcessID)
{
hHook = SetHook(WH_KEYBOARD, (HOOKPROC)KeyboardProc, NULL, te.th32ThreadID);
}
}
但是我的线程明明已经马上就结束了的啊(我用Process Viewer来看的)所以应该只有一个线程了,怎么键盘钩子的回调函数还是调用两次呢?