using System;
using System.Reflection;
using System.Runtime.InteropServices;
public class HookKeyBoard
{
/// <summary>
/// d
/// </summary>
/// <param name="code"></param>
/// <param name="State"></param>
public delegate void HookKeyBoardEventHandler(KeyBoardHookStruct code, ref int State);
/// <summary>
/// s
/// </summary>
public event HookKeyBoardEventHandler HookKeyBoardHandler;
private static HookProc myhookProc;
IntPtr _nextHookPtr; //记录Hook编号 
[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("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string name);[DllImport("User32.dll")]
internal extern static IntPtr CallNextHookEx(IntPtr handle, int code, IntPtr wparam, IntPtr lparam); //取得下一个Hook的API 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);//返回,让后面的程序处理该消息 }
} int State = 0;//2 var kbh = (KeyBoardHookStruct)Marshal.PtrToStructure(lparam, typeof(KeyBoardHookStruct));
HookKeyBoardHandler(kbh, ref State);return (IntPtr) State;
}
/// <summary>
/// 开始执行
/// </summary>
public void SetHook()
{
if (_nextHookPtr != IntPtr.Zero) //已经勾过了 
return;
myhookProc = MyHookProc; //声明一个自己的Hook实现函数的委托对象 _nextHookPtr = SetWindowsHookEx((int)HookType.KeyboardLL, myhookProc, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0); //加到Hook链中 }
public void UnHook()
{
if (_nextHookPtr != IntPtr.Zero)
{
UnhookWindowsHookEx(_nextHookPtr); //从Hook链中取消 
_nextHookPtr = IntPtr.Zero;
}
}
}