钩子函数 订阅
钩子函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息、事件进行过滤,访问在正常情况下无法访问的消息。钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统。 展开全文
钩子函数是Windows消息处理机制的一部分,通过设置“钩子”,应用程序可以在系统级对所有消息、事件进行过滤,访问在正常情况下无法访问的消息。钩子的本质是一段用以处理系统消息的程序,通过系统调用,把它挂入系统。
信息
外文名
Hook Function
中文名
钩子函数
钩子函数钩子函数
WINDOWS的钩子函数可以认为是WINDOWS的主要特性之一。利用它们,您可以捕捉您自己进程或其它进程发生的事件。通过“钩挂”,您可以给WINDOWS一个处理或过滤事件的回调函数,该函数也叫做“钩子函数”,当每次发生您感兴趣的事件时,WINDOWS都将调用该函数。一共有两种类型的钩子:局部的和远程的。局部钩子仅钩挂您自己进程的事件。远程的钩子还可以将钩挂其它进程发生的事件。远程的钩子又有两种:钩子分两种, 一种是系统级的全局钩子; 一种是线程级的钩子.全局钩子函数需要定义在 DLL 中, 线程级的钩子开始比较简单.其实钩子函数就三个:设置钩子: SetWindowsHookEx释放钩子: UnhookWindowsHookEx继续钩子: CallNextHookEx在线程级的钩子中经常用到 GetCurrentThreadID 函数来获取当前线程的 ID [1] 
收起全文
精华内容
下载资源
问答
  • 本文实例讲述了Flask框架钩子函数功能与用法。分享给大家供大家参考,具体如下: 在Flask中钩子函数是使用特定的装饰器的函数。为什么叫做钩子函数呢,是因为钩子函数可以在正常执行的代码中,插入一段自己想要执行...
  • 问题是当我在mounted钩子函数中获取offsetTop的时候,在新开的页签中打开页面,会得到错误的offsetTop,但是在当前页面刷新,就不会有问题。 定位问题 后来查到问题,就是加载的问题,新窗口打开图片,默认是没有带...
  • 一种在U3D开发环境下,为获取USB扫码枪数据进行的脚本开发,主要利用C#使用钩子函数来解决USB扫码枪扫描数据方面的问题,处理了扫码后的乱码问题。
  • c++钩子函数:copy hook c++调用钩子函数监视复制文件操作
  • 本文实例讲述了vue-router的钩子函数用法。分享给大家供大家参考,具体如下: vue路由钩子大致可以分为三类: 1.全局钩子 主要包括beforeEach和aftrEach, beforeEach函数有三个参数: to:router即将进入的路由对象 ...
  • 说到Vue的钩子函数,可能很多人只停留在一些很简单常用的钩子( created , mounted ),而且对于里面的区别,什么时候该用什么钩子,并没有仔细的去研究过,且Vue的生命周期在面试中也算是比较高频的考点,那么该如何...
  • 利用钩子函数,截获任何弹出的消息框MessageBox 截获所有弹出的消息框
  • 主要介绍了vue中父子组件传值,解决钩子函数mounted只运行一次的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 此程序为STM32F103 移植FreeRTOS系统工程源码,有需要可以学习参考,特别适合刚入门, 或者还没有入门的单片机开发者,可以提高代码开发周期,提升编程水平
  • 本文实例讲述了vue生命周期与钩子函数。分享给大家供大家参考,具体如下: <!DOCTYPE html> <html lang=en> <head> <meta charset=UTF-8> <title>www.jb51.net vue生命周期与钩子函数...
  • 因为我们有时候会在几个钩子函数里做一些事情,什么时候做,在哪个函数里做,我们不清楚。 于是我开始先去搜索,发现vue2.0的生命周期没啥文章。大多是1.0的版本介绍。最后还是找到一篇不错的(会放在最后) vue生命...
  • 主要介绍了解决VUE mounted 钩子函数执行时 img 未加载导致页面布局的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 今天小编就为大家分享一篇vue中各选项及钩子函数执行顺序详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 说到Vue的钩子函数,可能很多人只停留在一些很简单常用的钩子(created,mounted),而且对于里面的区别,什么时候该用什么钩子,并没有仔细的去研究过,且Vue的生命周期在面试中也算是比较高频的考点,那么该如何回答...
  • 什么是路由 什么是路由?网络原理中,路由指的是根据上一接口的数据包中的IP地址,查询路由表转发到另一个接口,它决定的是一个端到端的网络路径。 web中,路由的概念也是类似,根据URL来将请求分配到指定的一个’...
  • 有时我们想要在DOM绑定的时候设置自定义的样式,做法如下: // 自定义一个设置字体颜色的指令 Vue.directive('color', { bind: function (el) { el.style.color = 'red' } }) 使用: ...bind只要通过指令绑定给了...
  • 主要为大家详细介绍了Vue指令的钩子函数使用方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要为大家介绍了drupal中hook_link和hook_link_alter钩子函数,实例分析了钩子函数的具体用法,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 一个以C语言钩子函数来实现鼠标操作的demo
  • 简单的钩子函数

    2013-01-21 22:37:50
    钩子函数的简单使用 代码 入门级别的程序
  • FreeRTOS实验 FreeRTOS空闲任务钩子函数实验
  • 前几天领导问我一个问题:就是使用CFileDialog类在设置多选时选中的文件所放的文件缓冲区不知设置多大合适,本文将详细介绍,需要的朋友可以参考下
  • 这个利用 钩子函数监听鼠标和键盘时间的例子
  • v-focus(全局自定义指令钩子) <div id="box"> {{msg}} <p v-text="msg"></p> <p v-html="msg"></p> <input id="input" type="text" v-focus> </div> <!--引入...

    自定义指令

    v-focus(全局自定义指令钩子)

    <div id="box">
        {{msg}}
        <p v-text="msg"></p>
        <p v-html="msg"></p>
        <input id="input" type="text" v-focus>
    </div>
    
    <!--引入vue.js-->
    <script src="./base/vue.js"></script>
    <script>
        //要操作底层dom元素,例如初始化的时候让输入框获取焦点  
        //全局自定义指令   局部自定义指令
        //内置指令  v-if v-show v-else  v-for v-once v-model v-on v-bind  v-text v-html
        
        //全局注册自定义指令钩子:v-focus
       /*  Vue.directive("focus",{
            //当被绑定元素插入到父节点的时候,就会触发inserted钩子函数
            inserted(el){
                el.focus()
                //聚焦元素
            }
        }) */
        new Vue({
            el:"#box",
            directives:{
                focus:{
                    inserted(el){
                        el.focus()
                        //聚焦元素
                    }
                } 
            },
            data:{
                msg:"<h2>我是h2</h2>"
            }
        })
    </script>
    

    自定义指令的钩子函数


    一个指令定义对象可以提供如下几个钩子函数 (均为可选):

    bind:只调用一次,指令第一次绑定到元素时调用。在这里可以进行一次性的初始化设置。

    inserted:被绑定元素插入父节点时调用 (仅保证父节点存在,但不一定已被插入文档中)。

    update:所在组件的 VNode 更新时调用,但是可能发生在其子 VNode 更新之前。指令的值可能发生了改变,也可能没有。但是你可以通过比较更新前后的值来忽略不必要的模板更新 (详细的钩子函数参数见下)。

    我们会在稍后讨论渲染函数时介绍更多 VNodes 的细节。

    componentUpdated:指令所在组件的 VNode 及其子 VNode 全部更新后调用。

    unbind:只调用一次,指令与元素解绑时调用。

    <body>
        <div id="app">
            <div id="app">
                <my-comp v-if="msg" :msg="msg"></my-comp>
                <button @click="update">更新</button>
                <button @click="uninstall">卸载</button>
                <button @click="install">安装</button>
            </div>
        </div>
    
    <!--引入vue.js-->
    <script src="./base/vue.js"></script>
    <script>
        //创建了一个全局的自定义指令 v-hello
        Vue.directive('hello', {
            bind: function (el){
                console.log('bind');
            },
            inserted: function (el){
                console.log('inserted');
            },
            update: function (el){
                console.log('update');
            },
            componentUpdated: function (el){
                console.log('componentUpdated');
            },
            unbind: function (el){
                console.log('unbind');
            }
        });
        new Vue({
            el: '#app',
            data: {
                msg: 'Hello'
            },
            components: {
                myComp: {
                    template: '<h1 v-hello>{{msg}}</h1>',
                    props: {
                        msg: String
                    }
                }
            },
            methods: {
                update: function (){
                    this.msg = 'Hi';
                },
                uninstall: function (){
                    this.msg = '';
                },
                install: function (){
                    this.msg = 'Hello';
                }
            }
        })
    </script>
    

    钩子函数参数

    指令钩子函数会被传入以下参数:

    el:指令所绑定的元素,可以用来直接操作 DOM。
    binding:一个对象,包含以下 property:
    name:指令名,不包括 v- 前缀。
    value:指令的绑定值,例如:v-my-directive=“1 + 1” 中,绑定值为 2。
    oldValue:指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
    expression:字符串形式的指令表达式。例如 v-my-directive=“1 + 1” 中,表达式为 “1 + 1”。
    arg:传给指令的参数,可选。例如 v-my-directive:foo 中,参数为 “foo”。
    modifiers:一个包含修饰符的对象。例如:v-my-directive.foo.bar 中,修饰符对象为 { foo: true, bar: true }。
    vnode:Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
    oldVnode:上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

    这是一个使用了这些 property 的自定义钩子样例:

    <div id="hook-arguments-example" v-demo:foo.a.b="message"></div>
    
    Vue.directive('demo', {
      bind: function (el, binding, vnode) {
        var s = JSON.stringify
        el.innerHTML =
          'name: '       + s(binding.name) + '<br>' +
          'value: '      + s(binding.value) + '<br>' +
          'expression: ' + s(binding.expression) + '<br>' +
          'argument: '   + s(binding.arg) + '<br>' +
          'modifiers: '  + s(binding.modifiers) + '<br>' +
          'vnode keys: ' + Object.keys(vnode).join(', ')
      }
    })
    
    new Vue({
      el: '#hook-arguments-example',
      data: {
        message: 'hello!'
      }
    })
    

    在这里插入图片描述

    展开全文
  • C语言钩子函数详解

    千次阅读 2021-01-23 21:48:15
    钩子函数,从表面意思上看就不是一个名门正派,拿同事的话讲这个就是一个下三滥的手段(哈哈哈),不过对于初学者碰到钩子函数可能会有点蒙圈。正好最近又遇到了这个钩子函数,所以通过例子来详细讲解一下钩子函数,...

    目录

    一:C语言功能模块规范

    二:如何生成.a文件

    三:注册真正功能函数

    四:makefile编写

    五:编译运行结果


    钩子函数,从表面意思上看就不是一个名门正派,拿同事的话讲这个就是一个下三滥的手段(哈哈哈),不过对于初学者碰到钩子函数可能会有点蒙圈。正好最近又遇到了这个钩子函数,所以通过例子来详细讲解一下钩子函数,顺便也科普C语言一个完整的功能模块创建规范是什么样的。

    钩子函数本质上一个函数指针。这时候讲一些钩子函数什么作用,为什么要用钩子函数,可能大部分都听不懂,所以还是通过例子来解释。我们例子要实现一个什么样的功能,我们要引用一个静态库,里面有个函数初始化了三个学生的姓名,存储在结构体里,如何通过钩子函数来将三个学生的姓名给它钩出来。

    一:C语言功能模块规范

    正常情况下,一个大型的C语言工程,都会分成很多的功能模块,这样做一是将功能单一的模块放在一起,利于后续维护,二是各个模块分开每个人并行开发,文件层次更加清晰。

    每个C语言模块,一般都会有头文件,源文件,有的也会有静态库或者动态库文件,生成的目标文件。另外如果引用了静态库,也会有静态库的头文件。所以完整的C语言模块文件夹一般如下

    [root@promote c_LEARNING]# tree HOOKMAIN/
    HOOKMAIN/
    ├── include
    │   └── hookfunc_main.h
    ├── library
    │   ├── include
    │   └── lib
    │       └── libstudentsInfo.a
    ├── makefile
    ├── source
    │   └── hookfunc_main.c
    └── target
        └── hookfuncMain
    
    
    [root@promote HOOKMAIN]# ll
    total 4
    drwxrwxrwx 2 root root   29 Jan 23 19:52 include
    drwxrwxrwx 4 root root   32 Jan 23 19:52 library
    -rwxrwxrwx 1 root root 1279 Jan 23 20:53 makefile
    drwxrwxrwx 2 root root   29 Jan 23 19:51 source
    drwxr-xr-x 2 root root   26 Jan 23 20:53 target
    

    可以看到library文件夹里面又有include和lib文件夹,这就是上面提到的引用了静态库,会有.a文件和伴随静态库的.h文件

    二:如何生成.a文件

    什么是.a文件?.a文件就是静态库,静态库是一些.o目标文件的集合,一般以.a形式结尾。静态库在程序链接阶段使用,链接器将程序要用到的函数从库中提取出来,并整合到程序中,程序运行不再使用静态库了。由于每个程序要用到函数都从库提取并整合在一起,所以可执行文件夹会比较大。

    生成.a文件有两个步骤

    1,用gcc命令生成.o文件

    gcc -o 可执行文件 调用者的C源文件.c  -Ldir -l库文件名

    2,用ar命令组织.o文件生成.a文件

    ar rcs lib库文件名.a 目标文件1 目标文件2 ... 目标文件n
    • r:表示将.o目标文件加入到静态库中;
    • c:表示创建静态库;
    • s:表示生产索引;

    首先看一下我们生成.a文件的源文件students_info.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define FAIL    0
    #define SUCCESS 1
    
    typedef enum{
        STUDENTS_111 = 1,
        STUDENTS_222,
        STUDENTS_333
    }STUDENTS_INFO_NUM;
    
    typedef void (*GET_SUTDENTS_NAME_INFO_Fucptr)(char *pBuf, STUDENTS_INFO_NUM sutdentsNum);
    
    GET_SUTDENTS_NAME_INFO_Fucptr GET_SUTDENTS_NAME_INFO_HOOK=NULL;
    
    int egRegGetStudentsInfoFunc(GET_SUTDENTS_NAME_INFO_Fucptr pGetStudentsInfoFuc)
    {
        if(pGetStudentsInfoFuc == NULL)
        {
            return FAIL;
        }
        GET_SUTDENTS_NAME_INFO_HOOK = pGetStudentsInfoFuc;
        
        return SUCCESS;
    }
    
    void getStudentsInfoEntry()
    {
    	char *students_111_name = "KaiYing Z";
    	char *students_222_name = "TianZe F";
    	char *students_333_name = "WuMing R";
    	char *pBuf;
    
    	pBuf = students_111_name;
    	GET_SUTDENTS_NAME_INFO_HOOK(pBuf, STUDENTS_111);
    
    	pBuf = students_222_name;
    	GET_SUTDENTS_NAME_INFO_HOOK(pBuf, STUDENTS_222);
    
    	pBuf = students_333_name;
    	GET_SUTDENTS_NAME_INFO_HOOK(pBuf, STUDENTS_333);
    }
    

    提供了两个函数,一是注册函数egRegGetStudentsInfoFunc,功能是将干实事的函数注册进来,这时候只是留一个壳子。getStudentsInfoEntry函数就是后面要调用的函数,要将该函数中的三个学生名字给送出去,此时GET_SUTDENTS_NAME_INFO_HOOK(pBuf, STUDENTS_111);该函数具体实现的什么功能,这时候根本就不知道,要看后面注册进来的函数是实现什么功能才能确定,这时候只知道pBuf指向了三个学生名字的那块内存,至于名字怎么送?后面会讲

    介绍完了上面的功能,接着讲怎么将students_info.c打包成.a文件,命令如下

    gcc -c students_info.c
    ar cr libstudentsInfo.a students_info.o

    生成了libstudentsInfo.a文件,将生成的.a文件放到上述的library/lib文件夹下

    -rwxr-xr-x 1 root root 2154 Jan 23 20:00 libstudentsInfo.a
    -rwxrwxrwx 1 root root 1020 Jan 23 19:57 students_info.c
    -rw-r--r-- 1 root root 1936 Jan 23 19:59 students_info.o
    

    三:注册真正功能函数

    上述壳子留好了,接下来就是要写真正的钩子了。首先来看一下源代码hookfunc_main.c

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "hookfunc_main.h"
    
    extern int egRegGetStudentsInfoFunc(GET_SUTDENTS_NAME_INFO_Fucptr pGetStudentsInfoFuc);
    extern void getStudentsInfoEntry();
    
    T_STUDENTS_INFO g_StudentsInfo;
    
    void getStudentsName(char *pbuf,STUDENTS_INFO_NUM sutdentsNum)
    {
    	if(sutdentsNum == STUDENTS_111)
    	{
    		memcpy(g_StudentsInfo.sutdents_111_name,pbuf,strlen(pbuf));
    	}
    
    	if(sutdentsNum == STUDENTS_222)
    	{
    		memcpy(g_StudentsInfo.sutdents_222_name,pbuf,strlen(pbuf));
    	}
    
    	if(sutdentsNum == STUDENTS_333)
    	{
    		memcpy(g_StudentsInfo.sutdents_333_name,pbuf,strlen(pbuf));
    	}
    
    }
    
    int callback_function_register(void)
    {
    	int retVaule = egRegGetStudentsInfoFunc(getStudentsName);
    	return retVaule;
    }
    
    int main()
    {
    	memset(&g_StudentsInfo,'\0',sizeof(T_STUDENTS_INFO));
    	callback_function_register();
    	getStudentsInfoEntry();
    	printf("sutdents_111_name = %s\n",g_StudentsInfo.sutdents_111_name);
    	printf("sutdents_222_name = %s\n",g_StudentsInfo.sutdents_222_name);
    	printf("sutdents_333_name = %s\n",g_StudentsInfo.sutdents_333_name);
    	return 0;
    }
    

    头文件hookfunc_main.h

    #ifndef _HOOKFUNC_MAIN_H_
    #define _HOOKFUNC_MAIN_H_
    
    #define STUDENTS_NAME_MAX_LEN 128
    
    typedef enum{
        STUDENTS_111 = 1,
        STUDENTS_222,
        STUDENTS_333
    }STUDENTS_INFO_NUM;
    
    typedef void (*GET_SUTDENTS_NAME_INFO_Fucptr)(char *pBuf,STUDENTS_INFO_NUM sutdentsNum);
    
    typedef struct 
    {
        char sutdents_111_name[STUDENTS_NAME_MAX_LEN];
        char sutdents_222_name[STUDENTS_NAME_MAX_LEN];
        char sutdents_333_name[STUDENTS_NAME_MAX_LEN];
    } T_STUDENTS_INFO;
    
    
    #endif 
    

    getStudentsName函数就是上面提到的,具体要实现什么功能的函数。memcpy(g_StudentsInfo.sutdents_111_name,pbuf,strlen(pbuf));可以看到要实现的功能就是将pbug指向内存的数据拷贝到结构体里去。而students_info.c中的函数getStudentsInfoEntry里面pBuf正好指向了学生名字的内存。这样就通过钩子将学生的名字给勾出来了

    四:makefile编写

    上述提到了该模块虽然简单但是一个完整的功能模块,makefile肯定少不了,下面就贴出makefile

    _BIN_NAME          = hookfuncMain
    _BIN_SOURCE_PATH   = ./source/
    _INCLUDE_PATH      = ./include/ \
                         $(addprefix -I,../library/include/)
    
    _TARGET_PATH       = ./target/
    _LIB_PATH          = ./library
    _BIN_OBJECT_PATH   = $(_TARGET_PATH)obj/
    
    CC                 = gcc -march=native
    AR                 = ar
    ECHO               = @echo
    MKDIR              = mkdir -p
    RM                 = rm -rf
    CFLAGS             = -fPIC -Wall -O2
    
    _LIB_DEF          += $(_LIB_PATH)/lib/libstudentsInfo.a
    
    _BIN_SRC_C   = $(wildcard $(_BIN_SOURCE_PATH)*.c)
    _BIN_OBJ     = $(addprefix $(_BIN_OBJECT_PATH),$(subst .c,.o,$(notdir $(_BIN_SRC_C))))
    
    
    all:$(_TARGET_PATH)$(_BIN_NAME)
    $(_TARGET_PATH)$(_BIN_NAME):$(_BIN_OBJ)
    	@$(RM) -f $@
    	$(CC) $(CFLAGS) -o $@ $^ $(_MACRO_DEF) $(_LIB_DEF)
    	#@objdump -x $(_TARGET_PATH)$(_BIN_NAME) > $(_TARGET_PATH)symbol.txt
    	@echo GO  "------------------>" $(_TARGET_PATH)$(_BIN_NAME)
    	$(RM) $(_BIN_OBJECT_PATH)
    	@echo GO  "------------------  !BEAUTIFUL!  ------------------"
    
    $(_BIN_OBJECT_PATH)%.o:$(_BIN_SOURCE_PATH)%.c
    	$(ECHO) CC $<
    	@if [ ! -d $(_BIN_OBJECT_PATH) ]; then $(MKDIR) $(_BIN_OBJECT_PATH); fi
    	$(CC) $(CFLAGS) -c $< -o $@ -I $(_INCLUDE_PATH)
    
    .PHONY : clean
    
    clean:
    	$(RM) $(_BIN_OBJECT_PATH)
    

    五:编译运行结果

    执行编译命令生成可执行文件

    [root@promote HOOKMAIN]# make clean
    rm -rf ./target/obj/
    [root@promote HOOKMAIN]# make
    CC source/hookfunc_main.c
    gcc -march=native -fPIC -Wall -O2 -c source/hookfunc_main.c -o target/obj/hookfunc_main.o -I ./include/ -I../library/include/
    gcc -march=native -fPIC -Wall -O2 -o target/hookfuncMain target/obj/hookfunc_main.o  ./library/lib/libstudentsInfo.a
    #@objdump -x ./target/hookfuncMain > ./target/symbol.txt
    GO ------------------> ./target/hookfuncMain
    rm -rf ./target/obj/
    GO ------------------  !BEAUTIFUL!  ------------------
    

    运行可执行文件

    [root@promote HOOKMAIN]# cd target/
    [root@promote target]# ll
    total 12
    -rwxr-xr-x 1 root root 8784 Jan 23 20:53 hookfuncMain
    [root@promote target]# 
    [root@promote target]# ./hookfuncMain 
    sutdents_111_name = KaiYing Z
    sutdents_222_name = TianZe F
    sutdents_333_name = WuMing R
    
    

    !!!!大功告成!!!!!

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 97,864
精华内容 39,145
关键字:

钩子函数