您当前的位置:首页 > 养生 > 内容

全局消息钩子(关于全局钩子为什么一定要在DLL中)

不一定是必须要写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


声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,谢谢。

上一篇: 粉坨怎么吃(粉坨怎么吃好吃)

下一篇: 摩托罗拉手机铃声(摩托罗拉手机的自带铃声是什么)



推荐阅读

网站内容来自网络,如有侵权请联系我们,立即删除! | 软文发布 | 粤ICP备2021106084号