日期:2014-05-18  浏览次数:21001 次

c# 全局钩子问题
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace wa_hooktest
{
  public partial class Form1 : Form
  {
  public Form1()
  {
  InitializeComponent();
  }
  internal enum HookType //枚举,钩子的类型 
  {

  //MsgFilter = -1, 

  //JournalRecord = 0, 

  //JournalPlayback = 1, 

  Keyboard = 2,

  //GetMessage = 3, 

  //CallWndProc = 4, 

  //CBT = 5, 

  //SysMsgFilter = 6, 

  //Mouse = 7, 

  //Hardware = 8, 

  //Debug = 9, 

  //Shell = 10, 

  //ForegroundIdle = 11, 

  //CallWndProcRet = 12, 

  KeyboardLL = 13, 

  //MouseLL = 14, 

  };

  [DllImport("kernel32.dll")]
  static extern int GetCurrentThreadId(); //取得当前线程编号的API 

  [DllImport("User32.dll")]
  internal extern static void UnhookWindowsHookEx(IntPtr handle); //取消Hook的API 


  [DllImport("User32.dll")]
  internal extern static IntPtr SetWindowsHookEx(int idHook, [MarshalAs(UnmanagedType.FunctionPtr)] HookProc lpfn, IntPtr hinstance, int threadID); //设置Hook的API 


  [DllImport("User32.dll")]
  internal extern static IntPtr CallNextHookEx(IntPtr handle, int code, IntPtr wparam, IntPtr lparam); //取得下一个Hook的API 
  IntPtr _nextHookPtr; //记录Hook编号

  public delegate IntPtr HookProc(int code, IntPtr wparam, IntPtr lparam);
  public IntPtr MyHookProc(int code, IntPtr wparam, IntPtr lparam)
  {
  if (code < 0)
  {
  return CallNextHookEx(_nextHookPtr, code, wparam, lparam);
  } //返回,让后面的程序处理该消息 

  if (wparam.ToInt32() == 98 || wparam.ToInt32() == 66)
  {//如果用户输入的是 b

  this.textBox1.Text = "a";
  return (IntPtr)1; //直接返回了,该消息就处理结束了 
  }
  else
  {
  return IntPtr.Zero; //返回,让后面的程序处理该消息 
  }
   


  //if (wparam.ToInt32() == 91)
  //{
  // 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链中 

  //全局钩子
  _nextHookPtr = SetWindowsHookEx((int