• C#中的钩子是啥?


    起因

    不知道你有没有在写Windows桌面软件时遇到钩子(Hook)这个词,反正每次只要我重拾C#,开始写些桌面软件,都会遇到它。而且每次遇到它,我都是先百度一下,大概了解到它就是事件处理程序一样的东西就好了。所以现在,我脑中就是 钩子=handler

    但是这次遇到这个词之后,我又百度了它。我意识到我不能再这么折磨自己了,应该对这个概念有个更系统的理解。

    于是,我又打开了百度,与以往不同的是,我这次打算记录一下各种说法(微软文档、百度词条),并结合我的理解对它进行整理。

    过程

    百度词条描述

    钩子是windows提供的一种消息处理机制平台,是在程序正常运行中接受信息之前预先启动的函数,用来检查和修改传给该程序的信息,(钩子)实际上是一个处理消息的程序段,通过系统调用,把它挂入系统。每当特定的消息发出,在没有到达目的窗口前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权。这时钩子函数即可以加工处理(改变)该消息,也可以不做处理而继续传递该消息,还可以强制结束消息的传递(return)。

    度娘的这段话,细细读一下,其实已经把钩子的特点都描述的差不多了。

    • 它是一个消息处理的程序段,(windows上的消息机制在上层是封装成事件的)所以完全可以说它就是个事件处理程序,即EventHandler。
    • 它又是跑在程序之前的,
      如果下图是程序正常处理消息的情况:
      在这里插入图片描述
      那加了钩子应该是这样的,
      在这里插入图片描述
      怎么样,是不是特别形象生动,至于消息被钩子勾上去之后,经过钩子函数处理,是继续给用户程序,还是丢掉了,那就得看钩子函数是怎么处理了。

    微软文档说明

    钩子是一种机制——应用程序能通过钩子截获事件,例如消息、鼠标动作或者按下键盘。拦截特定类型事件的函数被称为钩子函数(程序)。钩子函数可以处理它收到的每个事件,然后修改或者丢弃。

    官方文档的描述与度娘意思差不多。而这里用到了一个词截获(Intercept)则更形象地描述了钩子。

    同时文档还给出了一些钩子使用的例子:

    1. 监视消息以进行调试
    2. 为宏的记录与回放提供支持
    3. 为一些按键提供支持
    4. 模拟键鼠输入
    5. 实现CBT程序

    需要注意的是,钩子往往会使系统变慢,因为它增加了系统为每个消息执行的处理量。所以非必要时就不要使用钩子了。
    这边择几个以上应用场景简单分析一下(只是个人的猜测):

    • 监视消息以进行调试,这个其实就是消息到达用户程序前,你截获它,然后打印它,然后决定下一步处理,有点类似打断点调试?或许就是用钩子实现的
    • 为按键提供支持,这个好理解,也很常用。就是我按下某个按键,你截获按键后,做一些额外处理,再继续传递按键。比如我按下F5刷新了,就是我截获了F5按键,在钩子函数中做了刷新操作,再传递给其他程序。
    • 模拟键鼠输入,其实应该和上一条差不多。截获原始消息,然后在钩子函数中,添加键鼠事件,就模拟了。感觉适用于快捷键的情况,比如原本要做许多键鼠操作,通过截获快捷键来在钩子函数中添加那一串键鼠操作来减少人的操作量。

    关于使用

    说了那么多,那使用起来难不难。
    有点难,因为原始的钩子是比较底层的东西,它是user32.dll库中的内容。
    通常用法如下,

    // 从库中导出
    [DllImport("user32.dll")]
    // 安装 调用 卸载
    ...
    
    • 1
    • 2
    • 3
    • 4

    当然现在NuGet上有各种封装过的钩子库,使用起来会简单许多。
    比如键鼠类的操作,搜索KeyMouseHook,可以出现一大堆库,用起来基本上只有几条语句。

    小结

    所以钩子就是可以截获到达用户程序之前的消息的处理函数。

  • 相关阅读:
    给奶牛做直播之四
    SQL基本语句
    【Linux】在Ubuntu下安装Zotero
    关于视频流读取失败的时间问题解决 & 利用修饰符进行限时操作
    IOU和NMS图解(附Python和C++代码)
    【2022最新版】你真的会性能测试吗?这些被你忽略了吗?
    Vue笔记
    C++教程(05)——数据类型
    值改变事件(SMART PLC梯形图FC)
    Winform C# .Net中给ListBox加ToolTip提示
  • 原文地址:https://blog.csdn.net/BadAyase/article/details/125358914