HOOK编程流程

一、安装钩子过程

  HHOOK SetWindowsHookEx(

    int idHook,

    HOOKPROC lpfn,

    HINSTANCE hMod,

    DWORD dwThreadId

  );

      idHook:指定将要安装的钩子过程的类型,包括:

        WH_CALLWNDPROC  --在操作系统将消息发送到目标窗口处理过程之前,对该消息进行监视

        WH_CALLWNDPROCRET  --对已被目标窗口过程处理过了的消息进行监视

        WH_CBT  --接受对CBT应用程序有用的消息

        WH_DEBUG  --对其他钩子过程进行调试

        WH_FOREGROUNDIDLE  --当应用程序的前台线程即将进入空闲状态时被调用,有助于在空闲时间内执行低优先级的任务

        WH_GETMESSAGE  --对发送到消息队列的消息进行监视

        WH_JOURNALPLAYBACK  --对此前由WH_JOURNALRECORD钩子过程记录的消息进行发送

        WH_JOURNALRECORD  --对发送到系统消息队列的输入消息进行记录

        WH_KEYBOARD  --对键盘按键消息进行监视

        WH_KEYBOARD_LL  --此钩子过程只能在WindowNT中安装,用来对底层的键盘输入事件进行监视

        WH_MOUSE  --对鼠标消息进行监视

        WH_MOUSE_LL  --此钩子过程只能在WindowNT中安装,用来对底层的鼠标输入事件进行监视

        WH_MSGFILTER  --监视由对话框、消息框、菜单条或滚动条中的输入事件引发的消息

        WH_SHELL  --接受对外壳应用程序有用的通知

        WH_SYSMSGFILTER  --监视由对话框、消息框、菜单条或滚动条中的输入事件引发的消息;该钩子过程对系统中所有应用程序的这类消息都进行监视

      lpfn:指向相应的钩子过程;如果参数dwThreadId为0或者指定了一个其他进程创建的线程之标识符,则参数lpfn必须指向一个位于某动态链接库中的钩子过程;否则参数lpfn可以指向当前进程相关的代码中定义的一个钩子过程;

      hMod:指定参数lpfn指向的钩子过程所在的DLL的句柄;如果参数dwThreadId指定的线程由当前进程创建,并且相应的钩子过程定义于与当前进程相关的代码中,则必须将参数hMod设为NULL;

      dwThreadId:指定与钩子过程相关的线程标识;如果为0,则安装的钩子过程将与桌面上运行的所有线程都相关;

  返回值:函数调用成功返回所安装的钩子过程的句柄,调用失败返回NULL;

二、安装鼠标钩子,监视鼠标消息

  LRESULT CALLBACK MouseProc(

    int nCode,

     WPARAM wParam,

    LPARAM lParam

  );

      nCode:确定钩子过程如何处理当前消息,包括:

        HC_ACTION  --表明参数wParam和lParam包含了关于鼠标消息的信息

        HC_NOREMOVE  --表明参数wParam和lParam包含了关于鼠标消息的信息,而且此鼠标消息尚未从消息队列中删除(程序调用了PeekMessage函数并设置了PM_NOREMOVE标志)

      wParam:指示鼠标消息的标识;

      lParam:指向MOUSEHOOKSTRUCT结构体指针;  

LRESULT CALLBACK MouseProc( int nCode, WPARAM wParam, LPARAM lParam)
{
    return 1;
}
.
.
.
HHOOK g_hMouse=NULL;
.
.
.
g_hMouse=SetWindowsHookEx(WH_MOUSE,MouseProc,NULL,GetCurrentThreadId());

三、安装键盘钩子

  LRESULT CALLBACK KeyboardProc(

    int code,

    WPARAM wParam,

     LPARAM lParam

  );

      nCode:确定钩子过程如何处理当前消息,包括:

        HC_ACTION  --表明参数wParam和lParam包含了关于键盘消息的信息

        HC_NOREMOVE  --表明参数wParam和lParam包含了关于键盘消息的信息,而且此键盘消息尚未从消息队列中删除(程序调用了PeekMessage函数并设置了PM_NOREMOVE标志)

      wParam:产生当前按键消息的键盘按键的虚拟键代码(“VK_”开头,如VK_SPACE);

      lParam:一个32位的整数,用来指定按键重复的次数、扫描码、扩展键标记、上下文代码等标记,包括:

        0~15位:指示重复次数,此值记录了由于用户连续按键引发的按键重复次数

        16~23位:指示扫描码,此值依赖于键盘生产厂家

        第24位:指示当前按键是否是功能键或数字小键盘上的键;如果是,其值为1

        25~28位:保留未用

        第29位:上下文代码,如果Alt键被按下,其值为1,否则为0

        第30位:指示当前的键状态,如果在此消息被发送之前该键是按下的,其值为1,否则为0

        第31位:指示变化状态,如果此键正在被按下,则其值为0  

LRESULT CALLBACK KeyboardProc( int code, WPARAM wParam, LPARAM lParam)
{
    if(VK_F1==wParam){  //按F1程序退出
        ::SendMessage(g_hWnd,WM_CLOSE,0,0);
        UnhookWindowsHookEx(g_hKeyboard);  //从钩子链中移走已安装的钩子
        UnhookWindowsHookEx(g_hMouse);      
    }else if( VK_F4==wParam || (1==(lParam>>29 & 1))){
        return 1;  //屏蔽Alt+F4的功能
    }else{
        return CallNextHookEx(g_hKeyboard,code,wParam,lParam);
    }
}
.
.
.
HHOOK g_hKeyboard=NULL;
.
.
.
g_hKeyboard=SetWindowsHookEx(WH_KEYBOARD,KeyboardProc,NULL,GetCurrentThreadId());

四、把钩子信息传递给钩子链中下一个等待接收信息的钩子过程

  LRESULT CallNextHookEx(

     HHOOK hhk,

     int nCode,

     WPARAM wParam,

    LPARAM lParam

  );

      hhk:指定当前钩子过程句柄,即SetWindowsHookEx函数的返回值;

      nCode:确定钩子过程如何处理当前消息,包括:

        HC_ACTION

        HC_NOREMOVE

      wParam:指示消息的标识;

      lParam:指向结构体指针;

五、移除已安装的钩子过程

  BOOL UnhookWindowsHookEx( HHOOK hhk );

六、全局钩子

  如果要屏蔽当前正在运行的所有进程的鼠标消息和键盘消息,则安装钩子过程的SetWindowsHookEx函数代码必须放到动态链接库中实现,且将SetWindowsHookEx函数的第三个参数指定为安装钩子过程所在的DLL的句柄,将第四个参数设为0;

时间: 2024-10-05 20:08:44

HOOK编程流程的相关文章

shell脚本编程——流程控制

shell脚本编程--流程控制 目   录 一. if 二. case 三. for 四. while 五. until 六. 综合应用 一.if 1.语法 (1)单分支 if  判断条件:then fi (2)双分支 if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 fi (3)多分支 if 判断条件1; then 条件为真的分支代码 elif 判断条件2; then 条件为真的分支代码 elif 判断条件3; then 条件为真的分支代码 else 以上条件都为假

Java TCP/UDP socket 编程流程总结

最近正好学习了一点用java socket编程的东西.感觉整体的流程虽然不是很繁琐,但是也值得好好总结一下. Socket Socket可以说是一种针对网络的抽象,应用通过它可以来针对网络读写数据.就像通过一个文件的file handler就可以都写数据到存储设备上一样.根据TCP协议和UDP协议的不同,在网络编程方面就有面向两个协议的不同socket,一个是面向字节流的一个是面向报文的. 对socket的本身组成倒是比较好理解.既然是应用通过socket通信,肯定就有一个服务器端和一个客户端.

Winsock 编程流程

最近看了<Window程序设计>感觉在网络方面讲的不错,讲的很通俗易懂,与大家一同交流 转载请注明出处:http://blog.csdn.net/u010484477谢谢^_^ 使用 Winsock 编程的一般步骤是比较固定的. 1.Winsock 库的装入.初始化和释放 所有的 WinSock 函数都是从 WS2_32.DLL 库导出的,VC++在默认情况下并没有连接到该库,如果想使用 Winsock API,就必须包含相应的库文件. #pragma commment(lib, "

2.1 LibCurl编程流程(转)

转载地址:http://blog.chinaunix.net/u/17660/showart_1822514.html2 LibCurl编程2.1 LibCurl编程流程在基于LibCurl的程序里,主要采用callback function (回 调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcurl将调用用户的回调函数实现特定功能.下面是利用libcurl完成传输任务的流程:1. 调用curl_global_init()初始化libcurl2. 调用

MFC中的HOOK编程

HOOK,n.钩, 吊钩,通常称钩子. 在计算机中,是Windows消息处理机制的一个平台,应用程序能够在上面设置子程以监视指定窗体的某种消息,并且所监视的窗体能够是其它进程所创建的.当消息到达后,在目标窗体处理函数之前处理它.钩子机制同意应用程序截获处理window消息或特定事件.     钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统.每当特定的消息发出,在没有到达目的窗体前,钩子程序就先捕获该消息,亦即钩子函数先得到控制权.这时钩子函数即能够加工处理(改变)该消息,也能够不作

10、shell编程+流程控制+分支嵌套

SHELL 编程 shell 是一个命令解释器,侦听用户指令.启动这些指令.将结果返回给用户(交互式的shell) shell 也是一种简单的程序设计语言.利用它可以编写一些系统脚本. 查看本机shell 信息: cat /etc/shells     --查看本支持的shell echo $SHELL --查看当前支持的shell shell 在执行命令时,各种命令的优先级: 别名 -> 关键字 -> 函数 -> 内置命令 -> 脚本 别名:命令的另一种形式,有些情况下可以简化命

钩子(hook)编程

一.钩子介绍 1.1钩子的实现机制 钩子英文名叫Hook,是一种截获windows系统中某应用程序或者所有进程的消息的一种技术.下图是windows应用程序传递消息的过程: 如在键盘中按下一键,操作系统将收到键按下消息,把消息放入消息队列,然后消息队列对消息进行派发,发给相应的应用程序,经过应用程序处理后发给操作系统,操作系统再调用相应的应用程序的创建的窗口过程. 我们可能通过钩子截获这些消息,让消息不再往下传递,或者说截获到感兴趣的消息后做点什么. 1.2钩子分类与实现 钩子分进程内钩子与全局

C语言编程流程

大家都知道,写程序大体步骤为:1.用编辑器编写源代码,如.c文件.2.用编译器编译代码生成目标文件,如.o.3.用链接器连接目标代码生成可执行文件,如.exe.但如果源文件太多,一个一个编译时就会特别麻烦,于是人们想到,为什么不设计一种类似批处理的程序,来批处理编译源文件呢,于是就有了make工具,它是一个自动化编译工具,你可以使用一条命令实现完全编译.但是你需要编写一个规则文件,make依据它来批处理编译,这个文件就是makefile,所以编写makefile文件也是一个程序员所必备的技能.对

LibCurl编程流程

在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcurl将调用用户的回调函数实现特定功能.下面是利用libcurl完成传输任务的流程: 1.       调用curl_global_init()初始化libcurl 2.       调用 curl_easy_init()函数得到 easy interface型指针 3.       调用curl_easy_setopt设置传输选