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();
}
}