不一定是必须要写DLL来HOOK全局钩子的Win32全局钩子的运行机制钩子实际上是一个处理消息的程序段,关于全局钩子为什么一定要在DLL中如果你只HOOK本进程得消息,可以把消息回调函数和调用钩子的函数写在一起,钩子程序就先捕获该消息,VC中不用DLL在窗体中加入全局钩子全局钩子是必须用DLL导出函数做的,必须调用SDK中的API函数SetWindowsHookEx来安装这个钩子函数,参数:hWnd是接受热键触发消息的窗口id:是热键的标识符,当全局钩子触发的时候。
关于全局钩子为什么一定要在DLL中
如果你只HOOK本进程得消息,可以把消息回调函数和调用钩子的函数写在一起,也就是只需要写个EXE就可以了。如果要HOOK全局消息,需要全局钩子,这样,需要把你的HOOK代码注入到系统每个进程里面去。而实现这个最好的方法,就是用DLL来实现。系统会自动把该DLL注入到所有的进程空间中。所以,不一定是必须要写DLL来HOOK
全局钩子的Win32全局钩子的运行机制
钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。对每种类型的钩子由系统来维护一个钩子链,最近安装的钩子放在链的开始,而最先安装的钩子放在最后,也就是后加入的先获得控制权。要实现Win32的系统钩子,必须调用SDK中的API函数SetWindowsHookEx来安装这个钩子函数,这个函数的原型是HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId);,其中,第一个参数是钩子的类型;第二个参数是钩子函数的地址;第三个参数是包含钩子函数的模块句柄;第四个参数指定监视的线程。如果指定确定的线程,即为线程专用钩子;如果指定为空,即为全局钩子。其中,全局钩子函数必须包含在DLL(动态链接库)中,而线程专用钩子还可以包含在可执行文件中。得到控制权的钩子函数在完成对消息的处理后,如果想要该消息继续传递,那么它必须调用另外一个SDK中的API函数CallNextHookEx来传递它。钩子函数也可以通过直接返回TRUE来丢弃该消息,并阻止该消息的传递。
VC中不用DLL在窗体中加入全局钩子
全局钩子是必须用DLL导出函数做的!但是线程钩子是可以做在程序里的!当全局钩子触发的时候,系统去DLL里寻找相关的触发函数!而不是在程序内部寻找的!所以假如你把钩子函数写在自己的程序内部,只能在你的程序是活动窗口的时候,消息才被触发的!但是你让程序失去输入焦点,钩子函数就会失效的!我很理解LZ的想法,我当初做全局钩子,也是不想要个DLL库的,觉得那很不美观的!但是Windows就是这样,她规定了的!没办法改的!假如你想捕捉很少的键盘消息,可以用注册热键的方法的!注册函数BOOL RegisterHotKey(HWND hWnd,intid,UINT fsModifiers,UINT vk);当你注册个热键的时候,热键一触发,就会给你设定的窗口发送消息的!参数:hWnd是接受热键触发消息的窗口id:是热键的标识符,为了使热键不冲突!fsModifoers是热键控键的组成部分!比如说你想把热键设置成ALT+S,那fsModifoers就是ALT部分,她总共有3个标识符MOD_ALTMOD_SHIFTMOD_WINvk是除了控制键其他的键!假如想截获多个控制键,比如ALT+SHIFT+S fsModifoers就可以写成MOD_ALT|MOD_SHIFT, vk写成s;
全局消息钩子
没什么问题, 防火墙自动记录一些程序的事件而已 有兴趣了解的话, 自己多翻翻:Hook 是很通用的技术了, 不过不少病毒木马也是用这些技术, 因此防火墙通常都会扫描和记录系统中的 Hook