C#中的公共勾子类
来源:互联网 发布:华工 美国人 知乎 编辑:程序博客网 时间:2024/05/24 16:13
/*
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勾子支持有问题,正在修改中.
- C#中的公共勾子类
- C#中的父类与子类
- C#中的类,子类,类的继承(待续)
- VC++中的子类化
- sturts1中的Action 子类
- Duilib中的子类化
- java中的原子类
- Java中的原子类
- JAVA中的原子类
- C#中的类,子类,类的继承,重构,虚方法,protected(续)
- C# 常用公共方法
- C#泛型类访问子类成员
- 黑马程序员-c语言-字符串求公共子类
- DataGrid中的公共事件
- Geodatabase中的子类(Subtypes)
- 子类重载父中的函数
- java子类中的构造函数
- JAVA中的MAP及其子类
- 上帝也会犯错,何况是微软!
- 在浮躁的年代里做好学问,难!
- AJAX的简单例子
- 手把手教你用ajax搭建页面
- 星际争霸兵种的诉苦(简略版)
- C#中的公共勾子类
- cisco
- 计算机类核心期刊(半月刊)
- linux下打包
- 阴影技术
- Servlet技术
- 在防火墙配置ArcGIS License server的端口
- Linux下添加硬盘、分区、格式化任务详解
- gcc参数详解