/*
c#全局勾子类
版本1.0
实现对部分消息的全局勾子,使用HookStart加勾子,使用HookStop摘勾子.
DLL下载地址 http://www.xdbook.com/blog/hookLib.dll
Hook hook = new Hook(Hook.WH_MOUST_LL);
hook.HookProcedure +=new HookLib.Hook.HookProc(hook_HookProcedure);
hook.HookStart();
//hook_HookProcedure 为消息处理函数
*/
using System;
using System.Runtime.InteropServices;
using System.Reflection;
namespace HookLib
{
/// <summary>
/// HookProc2 的摘要说明。
/// </summary>
public class Hook
{
public int MessageID = WH_MOUSE_LL;
public Hook(int MessageID)
{
//
// TODO:
//
this.MessageID = MessageID;
}
public const int WH_KEYBOARD_LL = 13;
public const int WH_MOUSE_LL = 14;
public const int WH_SHELL = 10;
public const int WH_CALLWNDPROC = 4;
public const int WH_CALLWNDPROCRET = 12;
public const int WH_CBT = 5;
public const int WH_DEBUG = 9;
public const int WH_FOREGROUNDIDLE = 11;
public const int WH_GETMESSAGE = 3;
public const int WH_HARDWARE = 8;
public const int WH_JOURNALPLAYBACK = 1;
public const int WH_JOURNALRECORD = 0;
public const int WH_KEYBOARD = 2;
public const int WH_MOUSE = 7;
public const int WH_MSGFILTER = -1;
public const int WH_SYSMSGFILTER = 6;
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
[DllImport("kernel32.dll")]
static extern int GetCurrentThreadId();
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
static int hHook = 0;
public event HookProc HookProcedure;
private int DefaultHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
if (HookProcedure(nCode,wParam,lParam)==1)
return CallNextHookEx(hHook, nCode, wParam, lParam);
return 1;
}
/// <summary>
/// 安装勾子类
/// </summary>
public void HookStart()
{
if(hHook == 0)
{
hHook = SetWindowsHookEx( MessageID,new HookProc(DefaultHookProc),Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0);
if(hHook == 0 )
{
HookStop();
throw new Exception("SetWindowsHookEx failed.");
}
}
}
/// <summary>
/// 卸载勾子类
/// </summary>
public void HookStop()
{
bool retKeyboard = true;
if(hHook != 0)
{
retKeyboard = UnhookWindowsHookEx(hHook);
hHook = 0;
}
if (!(retKeyboard))
{
throw new Exception("UnhookWindowsHookEx failed.");
}
}
}
}
--------------------------------------------------------------------------------------------------------------------
以上代码并非我自己写的,而是从网上找到并稍微修改了一下写成了类.
已经在XP系统测试过,可以实现鼠标和键盘的全局勾子.
对于SHELL勾子支持有问题,正在修改中.