我想编一个截获一个特定窗口键盘消息的HOOK,我把钩子函数放在一个
DLL里面,DLL的代码:#include <windows.h>
#include "hookdll.h"#pragma data_seg ("shared")
HHOOK oldhook=NULL;
#pragma data_seg()
#pragma comment(linker,"/SECTION:shared,RWS")int WINAPI DllMain(HINSTANCE hInstance,DWORD fdwReason,PVOID pvReserved)
{
return true;
}EXPORT LRESULT CALLBACK MyProcKey(int nCode, WPARAM wParam, LPARAM lParam)
{
//我在这儿什么也没做,只是把消息传递到下一个钩子
return CallNextHookEx(oldhook,nCode,wParam,lParam);
}EXPORT void CALLBACK SetHook(HHOOK hhk)
{
oldhook=hhk;
}我在主程序的WM_CREATE消息中调用了设置钩子的函数:
hk=::SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)MyProcKey,::GetModuleHandle("hookdll.dll"),::GetWindowThreadProcessId(hookwnd,NULL));
然后调用DLL里面的SETHOOK函数,把DLL中的全局变量赋值为hk,既SETWINDOWSHOOK的返回值但是当我运行程序的时候,每当我按下键盘,被 截获消息的窗口就出错
调式了一下,发现,这个被截获消息的窗口每当收到WM_KEYDOWN消息的时候就发生
violation,
请问高手,这是为什么,我哪儿编错了?
DLL里面,DLL的代码:#include <windows.h>
#include "hookdll.h"#pragma data_seg ("shared")
HHOOK oldhook=NULL;
#pragma data_seg()
#pragma comment(linker,"/SECTION:shared,RWS")int WINAPI DllMain(HINSTANCE hInstance,DWORD fdwReason,PVOID pvReserved)
{
return true;
}EXPORT LRESULT CALLBACK MyProcKey(int nCode, WPARAM wParam, LPARAM lParam)
{
//我在这儿什么也没做,只是把消息传递到下一个钩子
return CallNextHookEx(oldhook,nCode,wParam,lParam);
}EXPORT void CALLBACK SetHook(HHOOK hhk)
{
oldhook=hhk;
}我在主程序的WM_CREATE消息中调用了设置钩子的函数:
hk=::SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)MyProcKey,::GetModuleHandle("hookdll.dll"),::GetWindowThreadProcessId(hookwnd,NULL));
然后调用DLL里面的SETHOOK函数,把DLL中的全局变量赋值为hk,既SETWINDOWSHOOK的返回值但是当我运行程序的时候,每当我按下键盘,被 截获消息的窗口就出错
调式了一下,发现,这个被截获消息的窗口每当收到WM_KEYDOWN消息的时候就发生
violation,
请问高手,这是为什么,我哪儿编错了?
解决方案 »
- 如何在一个类中操作另一个类的被保护的对象
- 如何在dll中定义一个窗体,在程序中模态显示?
- Undocumented NT还是Undocumented 2000
- 关于VC网络编程NetGetJoinInformation函数
- 想系统的学习一下操作系统,那位朋友给介绍一本好书.谢谢!
- 我有一个类似写字版的程序,但如何才能加入一个类似VC里的自动填词功能?
- 请问:怎么才能得到窗口最小化的消息?
- 进程外组件程序的类厂对象与客户程序的类厂代理对象的第一次连接????
- 请问怎样得到当前系统时间?
- Combo Box的格式定义问题---我实在想不出来了
- 在vc中ADO编程,在程序中怎样添加SQLServer数据库的登录用户?
- 求教Popup类型的dialog的坐标怎么算
由于Win32进程的虚拟性,如果你把挂钩函数放在EXE之中,那么它肯定无法突破本进程的限制,也就无法挂在别的进程上了。
那下面这段代码是必要的吗?
#pragma data_seg ("shared")
HHOOK oldhook=NULL;
#pragma data_seg()
#pragma comment(linker,"/SECTION:shared,RWS")
也就是说,我可不可以不使用共享内存,而使用普通的全局变量来保存钩子句柄?
我该怎么去掉这个钩子呢?在DLL里面加一个UNHOOK的函数?还是另外有办法?
UnhookWindowsHookEx
放在DLL中,上面代碼是必要的,進程閒共享數據
具体在什么时候调用呢?是不是要在DLLMAIN里面判断调用的条件啊?
http://home.ncust.edu.cn/~titilima/readarticle.php?id=23
To 李马 :
上次看到一篇关于QQ病毒的文章,请问,那个程序在什么时候设置钩子呢?设置钩子要一个窗口句柄,只有在一个发送消息的窗口出现的时候才有这个句柄.是不是要在程序中陷入死循环,直到找到那个窗口句柄?这种方法类似查询方式,有没有其他方法,类似中断方式的?