C#钩子本线程内消息拦截

原创 2004年10月17日 21:30:00

钩子其实就是调用一下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
{
    ....
}


深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解【方便自己学习查阅】

深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解 一些运行机制: 在Win16环境中,DLL的全局数据对每个载入它的进程来说都是相同的;而在Win32环境中,情况却发生了变化,DLL...
  • u013969455
  • u013969455
  • 2015年10月09日 16:58
  • 1814

C#钩子本线程内消息拦截

http://blog.csdn.net/wztgq/archive/2006/08/02/1012087.aspx 
  • LeoMaya
  • LeoMaya
  • 2007年05月16日 11:06
  • 600

[引用]C#钩子本线程内消息拦截

http://blog.csdn.net/yiruoyun/archive/2004/10/17/140219.aspx钩子其实就是调用一下API而已:1、安装钩子:   SetWindowsHook...
  • xdev
  • xdev
  • 2004年10月20日 12:14
  • 1135

windows中使用钩子拦截消息

一、前 言 众所周知,Windows程式的运行是依靠发生的事件来驱动。换句话说,程式不断等待一个消息的发生,然后对这个消息的类型进行判断,再做适当的处理。处理完此次消息后又回到等待状态。从上面对...
  • zi_wu_xian
  • zi_wu_xian
  • 2013年04月25日 22:21
  • 3480

c#使用钩子拦截鼠标键盘事件

窗体本身带的键盘鼠标事件函数只能响应窗体自己的事件,窗体之外的事件是不会响应的。比如当窗体最小化的时候也响应就要用全局钩子拦截消息来处理了。 大概过程就是在窗体初始化时加载钩子,等待事件消息,事件触发...
  • gaiazhang
  • gaiazhang
  • 2016年12月30日 14:35
  • 1129

线程钩子

钩子的本质是一段用以处理系统消息程序,通过系统调用把它挂入系统。钩子种类很 多,每种钩 子可以截获并处理相应的消息当特定发出在到达目窗口之前,每种钩子可以截获并处理相应的消息,每当特定消息发出,在到达...
  • u014568921
  • u014568921
  • 2015年03月18日 16:09
  • 1746

C#钩子实现简单鼠标键盘的监控和屏蔽

一概要1 目的:完成简单的监控和屏蔽2 技术:钩子(系统监控必须全局钩子)3 步骤:   A 安装钩子   B 回调函数   C 处理函数   D 普通业务处理   ……4 完成下载源程序和运行程序h...
  • Linux7985
  • Linux7985
  • 2008年12月31日 10:16
  • 2206

C#中使用消息钩子的方法

1、声明一个钩子函数代理:     public   delegate   IntPtr   HookProc(int   nCode,   IntPtr   wParam,   IntPtr   l...
  • fenghao_5555
  • fenghao_5555
  • 2007年06月14日 15:27
  • 1073

VC++实现全局钩子勾住消息对话框

#ifndef _HOOKAPI_H #define _HOOKAPI_H class CHOOKAPI { public: LPVOID pOldFunEntry, pNewFun...
  • yincheng01
  • yincheng01
  • 2012年10月09日 20:19
  • 3120

<Win32> 使用钩子仿照Spy++截取消息

Win32程序对不同类型Message的处理过程不一样,对于Post过来的Message(通过PostMessage发送),会由GetMessage来处理,对于Send过来的Message(通过Sen...
  • Meta_Cpp
  • Meta_Cpp
  • 2015年01月21日 12:06
  • 2537
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#钩子本线程内消息拦截
举报原因:
原因补充:

(最多只允许输入30个字)