本线程钩子

钩子其实就是调用一下API而已:

 

1、安装钩子:
  SetWindowsHookEx
    函数原形:HHOOK SetWindowsHookEx(
                       int       idHook,    // 钩子类型,
                       HOOKPROC  lpfn,      // 钩子函数地址
                       INSTANCE  hMod,      // 钩子所在的实例的句柄,
                       DWORD     dwThreadId // 钩子所监视的线程的线程号
                      )
    hMod: 对于线程序钩子,参数传NULL;
    对于系统钩子:参数为钩子DLL的句柄
  dwThreadId:对于全局钩子,该参数为NULL。
    钩子类型用WH_CALLWNDPROC=4(发送到窗口的消息。由SendMessage触发)
    返回:成功:返回SetWindowsHookEx返回所安装的钩子句柄;
          失败:NULL;

 

2、回调,你要截获消息就在这里进行:
LRESULT WINAPI MyHookProc(
          int     nCode ,     // 指定是否需要处理该消息
          WPARAM  wParam,     // 包含该消息的附加消息
          LPARAM  lParam      // 包含该消息的附加消息
                        )

 

3、调用下一个钩子
LRESULT CallNextHookEx(
          HHOOK   hhk,      // 是您自己的钩子函数的句柄。用该句柄可以遍历钩子链
          int     nCode,    // 把传入的参数简单传给CallNextHookEx即可
          WPARAM  wParam,   // 把传入的参数简单传给CallNextHookEx即可
          LPARAM  lParam    // 把传入的参数简单传给CallNextHookEx即可
                      );

 

4、用完后记得卸载钩子哦,要不然你的系统会变得奇慢无比!
BOOL UnhookWindowsHookEx(
         HHOOK      hhk       // 要卸载的钩子句柄。
                      )

 

把上面这些API用C#封装一下,就可以直接用了!
给个线程钩子的例子吧(两个Form都在同一个线程中运行):

 

using System.Runtime.InteropServices;

 

public class Form1 : System.Windows.Forms.Form
{
    ...
    //定义委托(钩子函数,用于回调)
    public delegate int HookProc(int code, IntPtr wparam, ref CWPSTRUCT cwp);

 

    //安装钩子的函数
    [DllImport("User32.dll",CharSet = CharSet.Auto)]
    public static extern IntPtr SetWindowsHookEx(int type, HookProc hook, IntPtr instance, int threadID);
    //调用下一个钩子的函数
    [DllImport("User32.dll",CharSet = CharSet.Auto)]
    public static extern int CallNextHookEx(IntPtr hookHandle, int code, IntPtr wparam, ref CWPSTRUCT cwp);
    //卸载钩子
    [DllImport("User32.dll",CharSet = CharSet.Auto)]
    public static extern bool UnhookWindowsHookEx(IntPtr hookHandle);
    //获取窗体线程ID
    DllImport("User32.dll",CharSet = CharSet.Auto)]
    public static extern int GetWindowThreadProcessId(IntPtr hwnd, int ID);

 

    private HookProc hookProc;
    private IntPtr hookHandle = IntPtr.Zero;

 

    public Form1()
    {
        ....
        //挂接钩子处理方法
        this.hookProc = new HookProc(myhookproc);
    }

 

    //开始拦截
private bool StartHook()
    {
        Form2 f=new Form2();
        f.Show();//加上这个
        //安装钩子,拦截系统向Form2发出的消息
        this.hookHandle = SetWindowsHookEx(4, hookProc, IntPtr.Zero ,GetWindowThreadProcessId(f.Handle,0));
        return (this.hookHandle != 0);
    }

 

    //停止拦截
    private bool StopHook()
    {
        return UnhookWindowsHookEx(this.hookHandle);
    }

 

    //钩子处理函数,在这里拦截消息并做处理
    private int myhookproc(int code, IntPtr wparam, ref CWPSTRUCT cwp)
    {
        switch(code)
        {
    case 0:
    switch(cwp.message)
    {
        case 0x0000F://WM_PAINT,拦截WM_PAINT消息
                //do something
        break;
    }
            break;
        }
        return CallNextHookEx(hookHandle,code,wparam, ref cwp);
    }
   
    [StructLayout(LayoutKind.Sequential)]
    public struct CWPSTRUCT
    {
 public IntPtr lparam;
 public IntPtr wparam;
 public int message;
 public IntPtr hwnd;
    }
}

 

public class Form2 : System.Windows.Forms.Form
{
    ....
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven Web项目解决跨域问题

跨域问题目前笔者所用到的方案大致有三种:jsonp,SpringMVC 4以上注解方式和cros三方过滤器。 Jsonp JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这…

为什么Facebook的API以一个循环作为开头?

作者 | Antony Garand译者 | 无明如果你有在浏览器中查看过发给大公司 API 的请求,你可能会注意到,JSON 前面会有一些奇怪的 JavaScript:为什么他们会用这几个字节来让 JSON 失效?为了保护你的数据 如果没有这些字节,那…

城市轨道交通运营票务管理论文_城市轨道交通运营管理专业就业前景怎么样?中职优选告诉你...

​​城市轨道交通运营管理专业,专业就业前景怎么样?就业方向有哪些?有很多同学都感觉很迷忙,为了让更多的同学们了解城市轨道交通运营管理专业的就业前景与就业方向,整理出以下内容希望可以帮助同学们。城市轨道交通运…

计算机视觉对扫描文件分类 OCR

通过计算机视觉对扫描文件分类 一种解决扫描文档分类问题的深度学习方法 在数字经济时代, 银行、保险、治理、医疗、法律等部门仍在处理各种手写票据和扫描文件。在业务生命周期的后期, 手动维护和分类这些文档变得非常繁琐。 对这些非机密文档进行简…

从钱龙数据中读取股票权息信息导入到数据库

从钱龙数据中读取股票权息信息导入到数据库 前面写了如果读股票代码和日线数据,下面是如何读股票的权息信息。 钱龙中权息数据存储在QLDATA/history/shase/weight和QLDATA/history/sznse/weight目录下,每个文件对应一只股票。 与前文一样,只贴…

笑话生成器_爸爸笑话发生器

笑话生成器(If you’re just here for the generated jokes, scroll down to the bottom!)(如果您只是在这里生成笑话,请向下滚动到底部!) I thought: what is super easy to build, yet would still get an approving chuckle if someone found it on …

AWS Amplify Console:赋予应用程序快速部署的能力

AWS re:Invent 2018大会发布了很多新功能和服务,包括新的AWS Amplify Console,一种针对移动Web应用程序的持续部署服务。 AWS Amplify Console承诺可以支持快速发布新功能,避免在部署应用程序时停机,并降低同时更新应用程序客户端…

机器学习实践二 -多分类和神经网络

本次练习的任务是使用逻辑归回和神经网络进行识别手写数字(form 0 to 9, 自动手写数字问题已经应用非常广泛,比如邮编识别。 使用逻辑回归进行多分类分类 练习2 中的logistic 回归实现了二分类分类问题,现在将进行多分类,one vs…

Hadoop 倒排索引

倒排索引是文档检索系统中最常用的数据结构,被广泛地应用于全文搜索引擎。它主要是用来存储某个单词(或词组)在一个文档或一组文档中存储位置的映射,即提供了一种根据内容来查找文档的方式。由于不是根据文档来确定文档所包含的内…

koa2异常处理_读 koa2 源码后的一些思考与实践

koa2的特点优势什么是 koa2Nodejs官方api支持的都是callback形式的异步编程模型。问题:callback嵌套问题koa2 是由 Express原班人马打造的,是现在比较流行的基于Node.js平台的web开发框架,Koa 把 Express 中内置的 router、view 等功能都移除…

Bind9的dns解析服务

前言随着原中国电信集团按南北地域分家,新的中国电信和网通集团随即成立,互联网的骨干网也被一分为二了,北有网通、南有电信。从此,细心的网民可以发现,有些经常访问的网站速度一下子慢了下来,有时候还有访…

上凸包和下凸包_使用凸包聚类

上凸包和下凸包I recently came across the article titled High-dimensional data clustering by using local affine/convex hulls by HakanCevikalp in Pattern Recognition Letters. It proposes a novel algorithm to cluster high-dimensional data using local affine/c…

sqlmap手册

sqlmap用户手册 | by WooYun知识库 sqlmap用户手册 当给sqlmap这么一个url (http://192.168.136.131/sqlmap/mysql/get_int.php?id1) 的时候,它会: 1、判断可注入的参数 2、判断可以用那种SQL注入技术来注入 3、识别出哪种数据库 4、根据用户选择&…

幸运三角形 南阳acm491(dfs)

幸运三角形 时间限制:1000 ms | 内存限制:65535 KB 难度:3描述话说有这么一个图形,只有两种符号组成(‘’或者‘-’),图形的最上层有n个符号,往下个数依次减一,形成倒置…

jsforim

var isMouseDownfalse;var isFirsttrue;var centerdivObj;var ndiv1;var ndiv2;var ndiv3;var kjX;var kjY; window.οnerrοrfunction(){ return true;}; var thurlhttp://qq.jutoo.net/;var wzId12345; function createDiv(){ var sWscreen.width; var sHscree…

决策树有框架吗_决策框架

决策树有框架吗In a previous post, I mentioned that thinking exhaustively is exhausting! Volatility and uncertainty are ever present and must be factored into our decision making — yet, we often don’t have the time or data to properly account for it.在上一…

凑个热闹-LayoutInflater相关分析

前言 最近给组内同学做了一次“动态换肤和换文案”的主题分享,其中的核心就是LayoutInflater类,所以把LayoutInflater源码梳理了一遍。巧了,这周掘金新榜和部分公众号都发布了LayoutInflater或者换肤主题之类的文章。那只好站在各位大佬的肩膀…

ASP.NET Core文件上传、下载与删除

首先我们需要创建一个form表单如下: <form method"post" enctype"multipart/form-data" asp-controller"UpLoadFile" asp-action"FileSave"> <div> <div> <p>Form表单多个上传文件:</p> <input type…

8 一点就消失_消失的莉莉安(26)

文|明鸢Hi&#xff0c;中午好&#xff0c;我是暖叔今天是免费连载《消失的莉莉安》第26章消失的莉莉安▶▶往期链接&#xff1a;▼ 向下滑动阅读1&#xff1a;“消失的莉莉安(1)”2&#xff1a; 消失的莉莉安(2)3&#xff1a;“消失的莉莉安(3)”4&#xff1a;“消失的莉莉安…

透明的WinForm窗体

this.Location new System.Drawing.Point(100, 100); this.Cursor System.Windows.Forms.Cursors.Hand; // 定义在窗体上&#xff0c;光标显示为手形 this.Text "透明的WinForm窗体&#xff01;"; // 定义窗体的标题…