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 了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简单的低级钩子做的应用实例,实现了开机自动启动功能,程序启动后在后台运行,等待本地QQ启动后,开启钩子,记录键盘输入的字符,并保存在D:盘目录下的指定名文档中。关闭QQ时,钩子自动卸载并结束进程。 但是由于是使用的键盘钩子,所以只能简单的抓取键盘所键入的内容,如果是汉字的话则无法显示。 由于使用了Hook技术,并对注册表进行了修改,使用前请关闭360等防火墙软件,并使用管理员模式运行。 一次执行后,之后再次开机时,该程序会自动启动。 程序尚有缺陷,如内存泄漏,究其原因是CString应用在多线程中导致,但至今未查到根源所在,希望大神指教,学生不胜感激! 也希望各位多提出宝贵意见,或对本程序进行开发改造。 个人暂时希望改造的几个方面: 1.首先是希望能够屏蔽掉360等防火墙的检查。更深层次的改造,希望能够主动杀死360等防火墙的进程。 2.其次是希望能够做成主辅进程相互监视的模式,主进程down掉后,辅进程自动能把主进程启动,辅助进程down掉后,主进程能把辅进程自动启动。 3.其次是希望能够做成真正的隐藏进程的风格,就是能够在任务管理器中隐藏掉进程,其实可以做成服务,但是更希望能够以进程的形式存在。 4.然后很重要的是,希望能够做成自动获取管理员权限的类型,这个一直很想做,但是小菜我水平有限,暂时未对应。 5.希望对应网络开发,现在用钩子钩下来的文字,暂时只是保存在本地的一个txt文件中,希望最终实现把抓下来的内容发送到指定邮箱这样的功能。 暂时就先想到这么多吧,希望大家多多提出宝贵意见。 (最终声明:本程序只限用于研究学习开发技术,不得用于研究学习以外的任何目的) 作者:Benjamin Wang 2013-12-02

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值