欢迎光临
我们一直在努力

在C#中应用HOOK-.NET教程,C#语言

建站超值云服务器,限时71元/月

钩子(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 了!

小结:

这是一个非常简单的hook应用,当我们在做windows程序的时候,可能会用到这些东西。我正在试图做一个比较通用的类来进行一个封装,以便以后更好的使用。努力ing…

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 在C#中应用HOOK-.NET教程,C#语言
分享到: 更多 (0)