钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数之前处理它。钩子机制允许应用程序截获处理window消息或特定事件。
关于Hook的详细介绍,在微软的MSDN中有,http://www.microsoft.com/china/community/program/originalarticles/techdoc/hook.mspx
下面是我在C#中来应用Hook:
实现效果:
当用户在TextBox中输入 b 的时候,TextBox 始终显示 a
实现过程:
1、新建一个C#的WindowsApplication
2、在Form1中,添加下面一些变量:
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,
};
IntPtr _nextHookPtr; //记录Hook编号
3、在Form1中引入必须的API
[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
4、声明一个实现的委托
internal delegate IntPtr HookProc(int code, IntPtr wparam, IntPtr lparam);
5、添加自己的Hook处理过程
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; //返回,让后面的程序处理该消息
}
}
6、添加加入Hook链和从Hook链中取消的函数
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;
}
}
7、在Form1的Load事件中添加 SetHook() , 在Form1的closing 事件中添加 UnHook()
private void Form1_Load(object sender, System.EventArgs e)
{
SetHook();
}
private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
UnHook();
}
8、运行
输入 b , 发现 textbox 里面显示的是 a 了!
分享到:
相关推荐
C#中全局鼠标、键盘Hook的应用方法.doc
锁定屏蔽鼠标左右键 c# 源码 钩子hook应用 锁系统
Hook经典分析 关于QQ Hook的应用 钩子
C#中使用 Hook 的例子...
SocketHook 用 C# 编写,仅支持 Windows(32 位应用程序) 如何使用 运行 RegisterCOMObjects.bat(以管理员身份) 运行 HookAPI.exe 参数 p=<process> s=<bind> d=<forward> (bind_address 可以替换为 0.0.0.0,...
一个简单的Hook监听窗口键盘消息演示程序,使用C#开发,能正常运行使用,可用来学习Hook钩子应用。
C#键盘勾子(Hook)拦截器,屏蔽键盘活动 钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口...
c# hook钩子实现全局的鼠标点击可监听程序外的事件,单击,双击,滚轮,按键事件的触发,键盘按键的全局监听,鼠标的监听,程序可直接运行,供大家测试
简单实现窗体半透明,控件不透明效果,通过模态对话框显示。用两个窗体,下面一个窗体半透明,上面一个窗体背景却透明,实现效果...使用钩子捕获鼠标在半透明区域的点击事件,因为应用程序不响应半透明区域的鼠标消息。
在这里,给大家一个Delphi的源码,使用HOOK进行拦截处理任务管理器来实现. 在附件的文档中包含了源码,共分为两个部分:exe测试部分,Dll部分(HookDll,unithook). 我已经亲自编译测试过,可以实现拦截任务管理器的消息. ...
用Hook(即钩子)技术编写的应用程序添加到Windows的任务栏的指示区中就能够 很好的达到这个目的。我在参考了API帮助文档基础上,根据在Delphi开发环境中 的具体实现分别对这两部分进行详细论述。 一、Hook(钩子)的...
通过HOOK,防止任务管理器杀死进程,做到初步的进程保护
在C#中,我们可以使用钩子函数来拦截Windows操作系统产生的一些事件,例如鼠标、键盘或者窗口事件等。其中,窗口消息钩子(WH_CALLWNDPROC)是一种比较常见的钩子函数,它能够拦截窗口消息,并允许应用程序修改或阻止...
代码实现了进程隐藏与保护,通过hook系统函数。文件中包括内核级驱动及代码。应用程序级演示程序及代码。
1.基于C#语言winform开发. 2.重写了Textbox基类,以实现按下Tab不切换到下一焦点,在文本框内显示按下的那个键的键码与keycode. 3.实现了全局键盘钩子,减少一键回城的时间间隔延迟(雨之神助的一键回城反应太慢),更快的...
全局键盘鼠标钩子,适用于VB.NET,可用VS进行测试,内附源码测试,有了这个应该可以学习钩子的建立,以及在主程序的调用
一个将C#dll正确注入其他进程的项目。 注意:SharpNeedle当前仅支持32位进程。 欢迎您创建添加64位支持的请求请求。 基本原理 虽然仅将注入的自定义dll加载到目标进程的内存空间中很有趣,但这仅是故事的一半。 ...
C# 鼠标 键盘钩子使用例子.zip
这是一个C#通过调用全局钩子来锁定键盘和鼠标的源程序,旨在防止长时间使用电脑而产生眼睛疲劳,造成视力下降而得不偿失。它是一款完整的小软件、源程序,能很好地说明hook的应用。
使用hook监听全局的...另外有个小的应用监听PrintScreen操作,然后监听是否按下s键,若是则获取剪贴板的图片保存到文件中。文件路径可以通过配置文件设置。应用有客户端和Outlook插件两个版本。挺有意思的,分享下。