钩子函数

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
using System.Reflection;

namespace 钩子2

{

   private System.ComponentModel.Container components = null;
  private System.Windows.Forms.TextBox textBox1; 
  internal enum HookType //枚举,钩子的类型
  {
   Keyboard = 2,
  }
  IntPtr _nextHookPtr; //记录Hook编号

  //下面函数的具体参数见”我的其他电脑文档“里面!
  [DllImport("kernel32.dll")]
  static extern int GetCurrentThreadId(); //取得当前线程编号的API
  [DllImport("User32.dll")]
   //下面是取消Hook的API,钩子在使用完之后需要用UnHookWindowsHookEx()卸载,否则会造成麻烦。
  internal extern static void UnhookWindowsHookEx(IntPtr handle);
  [DllImport("User32.dll")]
   //下面是设置Hook的API,最后一个参数决定了此钩子是系统钩子还是线程钩子,线程勾子用于监视
   //指定线程的事件消息,系统勾子监视系统中的所有线程的事件消息。
  internal extern static IntPtr SetWindowsHookEx(int idHook, [MarshalAs(UnmanagedType.FunctionPtr)] HookProc lpfn, IntPtr hinstance, int threadID); 
  [DllImport("User32.dll")]
   //下面是以执行钩子链表所指的下一个钩子子程,钩子函数也可以通过直接返回TRUE来丢弃该消息,并阻止该消息的传递
  internal extern static IntPtr CallNextHookEx(IntPtr handle, int code, IntPtr wparam, IntPtr lparam);
  internal delegate IntPtr HookProc(int code, IntPtr wparam, IntPtr lparam);
  

  IntPtr MyHookProc(int code, IntPtr wparam, IntPtr lparam)

  {  
   if( code < 0 ) return CallNextHookEx(_nextHookPtr,code, wparam, lparam); //返回,让后面的程序处理该消息           
   if( wparam.ToInt32() == 98  ) //如果用户输入的是 b
   {
    this.textBox1.Text+="a";
    return   (IntPtr) 1; //直接返回了,该消息就处理结束了
   } 
   else if(wparam.ToInt32() == 66)
   {
    this.textBox1.Text+="A";
    return   (IntPtr) 1; //直接返回了,该消息就处理结束了
   }
   else
   {
    return IntPtr.Zero; //返回,让后面的程序处理该消息
   }
  }
  public void SetHook()

  {
   if( _nextHookPtr != IntPtr.Zero ) //已经勾过了
    return;
   HookProc myhookProc = new HookProc(MyHookProc); //声明一个自己的Hook实现函数的委托对象
   _nextHookPtr = SetWindowsHookEx((int)HookType.Keyboard, myhookProc , IntPtr.Zero ,  GetCurrentThreadId()); //加到Hook链中
  }
  public void UnHook()
  {
   if( _nextHookPtr != IntPtr.Zero ) //已经勾过了
  {
  UnhookWindowsHookEx(_nextHookPtr); //从Hook链中取消
  _nextHookPtr = IntPtr.Zero;
  }
  }
  public Form1()
  {
   //
   // Windows 窗体设计器支持所必需的
   //
   InitializeComponent();

   //
   // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
   //
  }

  /// <summary>
  /// 清理所有正在使用的资源。
  /// </summary>
  protected override void Dispose( bool disposing )
  {
   if( disposing )
   {
    if (components != null)
    {
     components.Dispose();
    }
   }
   base.Dispose( disposing );
  }

[STAThread]
  static void Main()
  {
   Application.Run(new Form1());
  }

  private void Form1_Load(object sender, System.EventArgs e)
  {
   SetHook();
  }

  private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
  {
   UnHook();
  }

 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值