精华内容
下载资源
问答
  • 钩子

    2018-05-03 22:06:23
    hook函数教程(一)什么是钩子一、什么是钩子 我们可以首先从字面上了解钩子钩子是干什么的呢?日常生活中,我们的钩子是用来钩住某种东西的,比如,说,鱼钩是用来钓鱼的,一旦鱼咬了钩,钩子就一直钩住鱼了,...

    hook函数教程(一)什么是钩子

    一、什么是钩子  

    我们可以首先从字面上了解钩子,钩子是干什么的呢?日常生活中,我们的钩子是用来钩住某种东西的,比如,说,鱼钩是用来钓鱼的,一旦鱼咬了钩,钩子就一直钩住鱼了,任凭鱼在水里怎么游,也逃不出鱼钩的控制。同样的,Windows的钩子Hook也是用来钩东西的,比较抽象的是他是用来钩Windows事件或者消息的。最常见的就是鼠标和键盘钩子,用Hook钩子钩住鼠标、键盘,当你的鼠标、键盘有任何操作时,通过Hook就能知道他们都做了什么了,多么形象啊,把老鼠Mouse钩住了,不管你干什么,都逃不过我钩子Hook的手掌心。
    技术上讲,钩子(Hook)是Windows消息处理机制的一个很重要的内容,谁叫Windows是基于消息的呢。应用程序可以通过钩子机制截获处理Window消息或是其他一些特定事件。
    我们可以在同一个钩子上挂很多东西。
    想起参加工作前要求被体检的时候,当你被登记之后,按照你的登记表上的顺序,就等着到各个科室一个一个的去检查吧。每一个科室都有决定你是否继续的可能,只有通过了这个,你才可以到下一个去,如果没有通过,那么,你是看不到最后的大夫了,可以直接over回家了。
    如果把体检比喻为事件的话,当事件发生时,应用程序(体检过程)可以在相应的钩子Hook上设置多个钩子子程序(Hook Procedures)(多个科室的检查),由其组成一个与钩子相关联的指向钩子函数的指针列表(钩子链表)(体检表,确定了你要走的顺序)。当钩子所监视的消息出现时(你拿着表格来体检了),Windows(导诊员)首先将其送到调用链表中所指向的第一个钩子函数中(体检表上第一个科室,一般是身高体重吧,呵呵),钩子函数将根据其各自的功能(每个科室检查的项目不一样啊)对消息进行监视(有的大夫就随便看看了事),、修改(碰到好心的大夫还可以帮你往好里添点呢,呵呵)和控制(有的大夫好严格啊),并在处理完成后(当然有的大夫就直接把你刷下了,回家吧,没有下一个了)把消息传递给下一钩子函数(下一个项目的科室,当然,也可以强制消息的传递,直接打发你回家)直至到达钩子链表的末尾(检查完了!)。在钩子函数交出控制权后,被拦截的消息最终仍将交还给窗口处理函数(好了,拿着表去上班吧)。
    虽然钩子函数对消息的过滤将会略加影响系统的运行效率,但在很多场合下通过钩子对消息的过滤处理可以完成一些其他方法所不能完成的特殊功能。

    二、比较专业的对钩子的技术性理解 

         钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。 

          Windows系统是建立在事件驱动的机制上的,说穿了就是整个系统都是通过消息的传递来实现的。而钩子是Windows系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子可以监视系统或进程中的各种事件消息,截获发往目标窗口的消息并进行处理。这样,我们就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比如截获键盘、鼠标的输入,屏幕取词,日志监视等等。可见,利用钩子可以实现许多特殊而有用的功能。

          钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不作处理而继续传递该消息,还可以强制结束消息的传递。

          一个Hook都有一个与之相关联的指针列表,称之为钩子链表,由系统来维护。这个列表的指针指向指定的,应用程序定义的,被Hook子程调用的回调函数,也就是该钩子的各个处理子程。当与指定的Hook类型关联的消息发生时,系统就把这个消息传递到Hook子程。一些Hook子程可以只监视消息,或者修改消息,或者停止消息的前进,避免这些消息传递到下一个Hook子程或者目的窗口。最近安装的钩子放在链的开始,而最早安装的钩子放在最后,也就是后加入的先获得控制权。 zdwork.cn

          Windows 并不要求钩子子程的卸载顺序一定得和安装顺序相反。每当有一个钩子被卸载,Windows 便释放其占用的内存,并更新整个Hook链表。如果程序安装了钩子,但是在尚未卸载钩子之前就结束了,那么系统会自动为它做卸载钩子的操作。

          大多数人或者网上文章认为全局钩子都要依赖于一个DLL才能正常工作的,常常会看到很多人在论坛上长期争论一个话题:“全局钩子一定要在DLL里面吗?”。实际上这里有一个概念的问题,究竟上面提到的全局钩子是指什么。通过对上面各种钩子的作用域的理解就会发现这个问题的答案。 本文来自智动软件zdwork.cn

    上面一共提到了15种钩子,他们的作用域请看下表: 

    Hook 

    Scope

    WH_CALLWNDPROC

    Thread or global

    WH_CALLWNDPROCRET

    Thread or global

    WH_CBT

    Thread or global

    WH_DEBUG

    Thread or global

    WH_FOREGROUNDIDLE

    Thread or global

    WH_GETMESSAGE

    Thread or global

    WH_JOURNALPLAYBACK

    Global only

    WH_JOURNALRECORD

    Global only 

    WH_KEYBOARD

    Thread or global

    WH_KEYBOARD_LL 

    Global only

    WH_MOUSE

    Thread or global

    WH_MOUSE_LL

    Global only

    WH_MSGFILTER

    Thread or global

    WH_SHELL

    Thread or global

    WH_SYSMSGFILTER

    Global only

    表一:钩子作用域

          WH_JOURNALPLAYBACK,WH_JOURNALRECORD,WH_KEYBOARD_LL,WH_MOUSE_LL、WH_SYSMSGFILTER这5种钩子本身的作用域就是全局的,不管钩子是直接写在应用程序的代码里还是放在DLL中,他们都能够钩住系统的消息。剩下的10种钩子,他们的作用域既可以是线程的又可以是全局的,当将相应的钩子直接写在应用程序的代码中时,他们只能捕获当前线程上下文的消息。那么他们如何实现捕获全局消息的功能呢?当把钩子写入到一个单独的DLL中再引用后,系统自动将该DLL映射到受钩子函数影响的所有进程的地址空间中,即将这个DLL注入了那些进程,从而达到捕获全局消息的目的。相对来说,前面5种钩子本身就是全局的,是不需要注入的。 智动软件

          因此,对于前面问题的答案就是:要实现捕获全局消息功能的钩子,是否要写在单独的DLL里面,取决于钩子的类型以及相应的作用域。

          系统必须要处理每个消息,而钩子的使用增加了系统对每个消息要执行的处理的数量,因此,钩子会减慢系统。应该仅仅在必须的时候才安装钩子,并且尽可能早的将其卸载掉。 

    三、Hook Chain(钩子链表) 

          系统支持很多不同种类的钩子,每种类型提供对消息处理机制里的某一不同方面的访问。例如,应用程序可以使用WH_MOUSE Hook监视鼠标消息的传递。

          系统为每类钩子维护着一个独立的钩子链表。钩子链表是一个指针的列表,其中的指针指向特定的、应用程序定义的回调函数,该函数被叫做钩子子程(hook procedure)。当与某种特定类型的钩子相关联(钩住)的消息发生时,系统将消息一个接一个地传递给钩子链中的每一个钩子子程(hook procedure),钩子子程能够采取的动作取决于涉及的钩子的类型。某些类型的钩子子程仅仅能监视消息;另外一些就能够修改消息或者终止消息在钩子链表中的前进,这样就阻止了消息到达下一个钩子子程或者目标窗体。

          这里有几个概念上的翻译,主要有:

                  Hook Chain : 钩子链表

                  hook procedures : 钩子子程(即得到消息后进行处理的程序段) 

         如果对于同一事件既安装了线程勾子又安装了全局勾子,那么系统会自动先调用线程勾子,然后调用全局勾子。

     

    最近学习hook,看了几个教程:

    1)http://blog.sina.com.cn/s/articlelist_1585708262_3_1.html

    2)http://www.lellansin.com/windows-api-%E6%95%99%E7%A8%8B%EF%BC%88%E4%B8%83%EF%BC%89-hook-%E9%92%A9%E5%AD%90%E7%9B%91%E5%90%AC%EF%BC%88%E7%BC%96%E5%86%99%E4%B8%AD%EF%BC%89.html

    3)http://blog.csdn.net/camly/article/details/1752798

    展开全文
  • 函数钩子函数钩子函数钩子函数钩子函数钩子函数钩子函数钩子函数钩子函数钩子函数钩子函数钩子函数钩子函数钩子函数钩子函数钩子函数钩子函数钩子函数钩子
  • Vue的生命周期钩子函数介绍

    万次阅读 多人点赞 2019-05-11 22:45:23
    Vue的生命周期钩子函数介绍 vue生命周期共分为四个阶段 一:实例创建 二:DOM渲染 三:数据更新 四:销毁实例 共有八个基本钩子函数 1.beforeCreate --创建前 触发的行为:vue实例的挂载元素$el和数据对象data都为...

    感谢内容提供者:金牛区吴迪软件开发工作室

    Vue的生命周期钩子函数介绍

    vue生命周期共分为四个阶段

    一:实例创建
    二:DOM渲染
    三:数据更新
    四:销毁实例

    共有八个基本钩子函数

    1.beforeCreate --创建前
    触发的行为:vue实例的挂载元素$el和数据对象data都为undefined,还未初始化。
    在此阶段可以做的事情:加loading事件

    2.created --创建后
    触发的行为:vue实例的数据对象data有了,$el还没有
    在此阶段可以做的事情:解决loading,请求ajax数据为mounted渲染做准备

    3.beforeMount --渲染前
    触发的行为:vue实例的$el和data都初始化了,但还是虚拟的dom节点,具体的data.filter还未替换
    在此阶段可以做的事情:。。。

    4.mounted --渲染后
    触发的行为:vue实例挂载完成,data.filter成功渲染
    在此阶段可以做的事情:配合路由钩子使用

    5.beforeUpdate --更新前
    触发的行为:data更新时触发
    在此阶段可以做的事情:。。。

    6.updated —更新后
    触发的行为:data更新时触发
    在此阶段可以做的事情:数据更新时,做一些处理(此处也可以用watch进行观测)

    7.beforeDestroy —销毁前
    触发的行为:组件销毁时触发
    在此阶段可以做的事情:可向用户询问是否销毁

    8.destroyed —销毁后
    触发的行为:组件销毁时触发,vue实例解除了事件监听以及和dom的绑定(无响应了),但DOM节点依旧存在
    在此阶段可以做的事情:组件销毁时进行提示

    展开全文
  • 编写钩子程序的步骤分为三步:定义钩子函数、安装钩子和卸载钩子。 1.定义钩子函数  钩子函数是一种特殊的回调函数。钩子监视的特定事件发生后,系统会调用钩子函数进行处理。不同事件的钩子函数的形式是各不...
  • windows钩子

    2015-01-30 16:53:09
    有关windows钩子的工程文件,包括实现全局windows钩子的dll工程和windows钩子的应用实例工程两部分,windows钩子工程同时实现了鼠标和键盘钩子,本工程可以作为windows钩子应用的框架,加以改造后就可以实现不同的...
  • C#键盘钩子之局部钩子和全局钩子

    千次阅读 2018-05-12 15:46:39
    最近碰巧要使用键盘钩子,于是在网上搜索了一番,发现大多数博客的文章都是雷同的,根本就没有讲清楚全局钩子和局部钩子的区别,于是特开一贴,讲全局钩子和局部钩子捋一捋。也供后面的人学习。 应为大部分应用都...

    最近碰巧要使用键盘钩子,于是在网上搜索了一番,发现大多数博客的文章都是雷同的,根本就没有讲清楚全局钩子和局部钩子的区别,于是特开一贴,讲全局钩子和局部钩子捋一捋。也供后面的人学习。
    因为大部分应用都应该采用局部钩子,所以我这儿使用的是局部钩子,而全局钩子的例子网上到处都是。
    大部分网上参考文章都只是展示了全局钩子的写法,而线程钩子的写法和介绍相对少一些,特别是关键语句上如果定义的不正确是没有任何效果的,在自己反复尝试后决定留下一个正确的版本分享出来
    代码如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Reflection;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
    
    namespace AssistToolSet.Util
    {
        /// <summary>
        /// 键盘钩子类
        /// </summary>
        public class Hook
        {
            public delegate int HookProc(WH_CODE nCode, Int32 wParam, IntPtr lParam);
            public enum WH_CODE : int
            {
                WH_JOURNALRECORD = 0,
                WH_JOURNALPLAYBACK = 1,
                /// <summary>
                /// 进程钩子
                /// </summary>
                WH_KEYBOARD = 2,
    
                /// <summary>
                /// 底层键盘钩子 全局钩子就是用这个
    
                /// </summary>
                WH_KEYBOARD_LL = 13,
            }
    
            public enum HC_CODE : int
            {
                HC_ACTION = 0,
                HC_GETNEXT = 1,
                HC_SKIP = 2,
                HC_NOREMOVE = 3,
                HC_NOREM = 3,
                HC_SYSMODALON = 4,
                HC_SYSMODALOFF = 5
            }
    
            /// <summary>
            /// 安装钩子
            /// </summary>
            [DllImport("user32.dll", SetLastError = true, CallingConvention = CallingConvention.StdCall)]
            public static extern IntPtr SetWindowsHookEx(WH_CODE idHook, HookProc lpfn, IntPtr pInstance, uint threadId);
    
            /// <summary>
            /// 卸载钩子
            /// </summary>
            [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
            public static extern bool UnhookWindowsHookEx(IntPtr pHookHandle);
            /// <summary>
            /// 传递钩子
            /// </summary>
            [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
            public static extern int CallNextHookEx(IntPtr pHookHandle, WH_CODE nCodem, Int32 wParam, IntPtr lParam);
    
            /// <summary>
            /// 获取全部按键状态
            /// </summary>
            /// <param name="pbKeyState"></param>
            /// <returns>非0表示成功</returns>
            [DllImport("user32.dll")]
            public static extern int GetKeyboardState(byte[] pbKeyState);
    
            /// <summary>
            /// 获取程序集模块的句柄
            /// </summary>
            /// <param name="lpModuleName"></param>
            /// <returns></returns>
            [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
            public static extern IntPtr GetModuleHandle(string lpModuleName);
    
            /// <summary>
            /// 获取当前进程中的当前线程ID
            /// </summary>
            /// <returns></returns>
            [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
            public static extern uint GetCurrentThreadId();
    
            #region 私有变量
    
            private byte[] mKeyState = new byte[256];
            private Keys mKeyData = Keys.None; //专门用于判断按键的状态
    
            /// <summary>
            /// 键盘钩子句柄
            /// </summary>
            private IntPtr mKetboardHook = IntPtr.Zero;
    
            /// <summary>
            /// 键盘钩子委托实例
            /// </summary>
            private HookProc mKeyboardHookProcedure;
    
            #endregion
    
            #region 键盘事件
    
            public event KeyEventHandler OnKeyDown;
            public event KeyEventHandler OnKeyUp;
    
            #endregion
    
            /// <summary>
            /// 构造函数
            /// </summary>
            public Hook()
            {
                GetKeyboardState(this.mKeyState);
            }
    
            ~Hook()
            {
                UnInstallHook();
            }
    
            /// <summary>
            /// 键盘钩子处理函数
            /// </summary>
            private int KeyboardHookProc(WH_CODE nCode, Int32 wParam, IntPtr lParam)
            {
            /*全局钩子应该这样设定
             KeyboardHookStruct MyKeyboardHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
            */
                // 定义为线程钩子时,wParam的值是击打的按键,与Keys里的对应按键相同
                if ((nCode == (int)HC_CODE.HC_ACTION) && (this.OnKeyDown != null || this.OnKeyUp != null))
                {
                    mKeyData = (Keys)wParam;
                    KeyEventArgs keyEvent = new KeyEventArgs(mKeyData);
                    //这里简单的通过lParam的值的正负情况与按键的状态相关联
                    if (lParam.ToInt32() > 0 && this.OnKeyDown != null)
                    {
                        this.OnKeyDown(this, keyEvent);
                    }
                    else if (lParam.ToInt32() < 0 && this.OnKeyUp != null)
                    {
                        this.OnKeyUp(this, keyEvent);
                    }
                }
                if (ShortcutManagement.s_bHotkeyUsed)
                {
                    ShortcutManagement.s_bHotkeyUsed = false;
                    return 1;
                }
    
                return CallNextHookEx(this.mKetboardHook, nCode, wParam, lParam);
            }
            /// <summary>
            /// 安装钩子
            /// </summary>
            /// <returns></returns>
            public bool InstallHook()
            {
                //线程钩子时一定要通过这个取得的值才是操作系统下真实的线程
                uint result = GetCurrentThreadId();
    
                if (this.mKetboardHook == IntPtr.Zero)
                {
                    this.mKeyboardHookProcedure = new HookProc(this.KeyboardHookProc);
                    //注册线程钩子时第三个参数是空
                    this.mKetboardHook = SetWindowsHookEx(WH_CODE.WH_KEYBOARD, this.mKeyboardHookProcedure, IntPtr.Zero, result);
                    /*
                    如果是全局钩子应该这样使用
                    this.mKetboardHook = SetWindowsHookEx(WH_CODE.WH_KEYBOARD_LL, mKeyboardHookProcedure,GetModuleHandle(System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName), 0);
                    */
                    if (this.mKetboardHook == IntPtr.Zero)
                    {
                        return false;
                    }
                }
                return true;
            }
    
            /// <summary>
            /// 卸载钩子
            /// </summary>
            /// <returns>true表示成功 </returns>
            public bool UnInstallHook()
            {
                bool result = true;
                if (this.mKetboardHook != IntPtr.Zero)
                {
                    result = UnhookWindowsHookEx(this.mKetboardHook) && result;
                    this.mKetboardHook = IntPtr.Zero;
                }
                return result;
            }
        }
    
    }
    

    通过这次认知,意识到,以后如果要做这些接触相关的api的时候,我们应该尽量去查官方文档,而不是一开始就是查看别人的博客。应该以官方文档为主。一定要记住键盘钩子事件。32位和64位的系统不一样。

    展开全文
  • form表单源码解析: 局部钩子: 全局钩子: 转载于:https://www.cnblogs.com/zhangsanfeng/p/9240855.html

     

    form表单源码解析:

     

    局部钩子:

     

     

     

    全局钩子:

     

     

     

    转载于:https://www.cnblogs.com/zhangsanfeng/p/9240855.html

    展开全文
  • 枚举消息钩子,钩子,消息钩子检测,供大家参考
  • 键盘钩子hook键盘钩子

    2008-09-01 12:01:56
    键盘钩子 键盘钩子 键盘钩子 键盘钩子 键盘钩子 键盘钩子 键盘钩子 键盘钩子 键盘钩子
  • WINDOWS的钩子函数可以认为是WINDOWS的主要特性之一。利用它们,您可以捕捉您自己进程或其它进程发生的事件。通过“钩挂”,您可以给WINDOWS一个处理或过滤事件的回调函数,该函数也叫做“钩子函数”,当每次发生您...
  • 钩子(HOOK)函数教程

    万次阅读 2018-06-26 13:09:22
    日常生活中,我们的钩子是用来钩住某种东西的,比如,说,鱼钩是用来钓鱼的,一旦鱼咬了钩,钩子就一直钩住鱼了,任凭鱼在水里怎么游,也逃不出鱼钩的控制。同样的,Windows的钩子Hook也是用来钩东西的,比较抽...
  • 08 钩子编程.ppt

    2020-01-03 23:44:52
    钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 钩子编程 ...
  • 免费送了 包含两种钩子程序 键盘钩子和鼠标钩子 需要的朋友可以看看
  • C++ 关于钩子的知识点博客网上基本写的都非常详细,这里只是简单分享一下本人练手的编程步骤和一些简单认识。 钩子程序就大概分成了2种: (1) 进程中的钩子:它 的作用范围只是限定在某个进程中,或者某个线程...
  • Git 钩子

    2019-01-11 01:02:33
    1.1. 安装钩子 1.2. 脚本语言 1.3. 钩子的作用域 2. 本地钩子 2.1. 预提交钩子 Pre-Commit 2.2. 准备提交信息钩子 Prepare Commit Message 2.3. 提交信息钩子 Commit Message 2.4. 提交后钩子 Post...
  • Hook钩子\发声钩子.doc

    2011-08-03 23:32:18
    Hook钩子\发声钩子.docHook钩子\发声钩子.docHook钩子\发声钩子.docHook钩子\发声钩子.doc
  • 钩子程序

    2019-12-25 17:19:53
    钩子程序 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程序以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子...
  • c++ hook 全局钩子 全局键盘钩子

    热门讨论 2012-01-16 19:22:45
    c++ hook 全局钩子 全局键盘钩子
  • Vue钩子

    千次阅读 2019-06-12 08:34:07
    Vue钩子 1、钩子函数 指令定义函数提供了几个钩子函数(可选): bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作。 inserted: 被绑定元素插入父节点时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,484
精华内容 12,993
关键字:

钩子