当前位置:  编程技术>.net/c#/asp.net

c# 系统钩子的实现代码

    来源: 互联网  发布时间:2014-08-30

    本文导语:  c# 系统钩子的实现代码,有需要的朋友可以参考下。 纵览互联网,很多文章都提到系统钩子(Hook)必须是一个dll,这样Windows才能在所有进程中共享钩子代码。 与钩子相关的3个Windows API函数是: SetWindowsHookEx、UnhookWindowsHookEx、Call...

c# 系统钩子的实现代码,有需要的朋友可以参考下。

纵览互联网,很多文章都提到系统钩子(Hook)必须是一个dll,这样Windows才能在所有进程中共享钩子代码。

与钩子相关的3个Windows API函数是:
SetWindowsHookEx、UnhookWindowsHookEx、CallNextHookEx,它们的简要说明如下:
 

代码示例:
HHOOK SetWindowsHookEx(
int idHook,
HOOKPROC lpfn,
HINSTANCE hMod,
DWORD dwThreadId);

说明:
idHook -- 系统钩子类型,实际上是一个int值,具体的定义请看MSDN
lpfn -- 钩子回调函数指针,当收到钩子消息时就执行这个回调函数,回调函数有3个参数,不同类型的钩子这3个参数有不同的含义,具体请看MSDN。
hMod -- DLL实例句柄(我猜是这样,我不熟悉Win32API编程),当钩子为系统钩子时这个参数是必须的,如果是单个程序或者线程使用的钩子那么可以不用这个值。
dwThreadId -- 线程ID,如果是单个程序或者线程使用的钩子这个参数是必须的。
SetWindowsHookEx返回所设置的钩子的句柄。
BOOL UnhookWindowsHookEx(HHOOK hhk);
hhk -- 所要注销的钩子的句柄

UnhookWindowsHookEx返回注销钩子是否成功。
 

代码示例:
LRESULT CallNextHookEx(
HHOOK hhk,
int nCode,
WPARAM wParam,
LPARAM lParam);

hhk -- 起始钩子句柄,如果是在钩子回调函数中调用CallNextHookEx时传的通常是本钩子句柄。
nCode -- 钩子回调函数参数1,具体含义视钩子类型而定。
wParam -- 钩子回调函数参数2,具体含义视钩子类型而定。
lParam -- 钩子回调函数参数3,具体含义视钩子类型而定。

从以上3个函数的简要说明,我们可以看出所用到的参数几乎都是简单的参数,稍微复杂就是回调函数(在C#中用delegate类型来实现,后面会提到)。
不过,最让人头疼的则是DLL的实例句柄,C#制作的DLL并不像C做的DLL有DllMain入口可以接受到DLL实例句柄。

我目前唯一的办法,是使用C做一个系统钩子DLL再让C#调用。底下是DLL的代码。
 

代码示例:

#define _WIN32_WINNT 0x0500

#include < Windows.h >
#include < WinUser.h >

#define Dll_Export __declspec(dllexport)

/**/ /* DLL实例句柄 */

HINSTANCE instance = NULL;

BOOL APIENTRY DllMain(HINSTANCE hInstance, DWORD ul_reason_for_call, LPVOID lpReserved)
{
instance = hInstance;
return TRUE;
}

/**/ /*
*功能:设置系统钩子
*hookType -- 钩子类型
*hookproc -- 钩子回调函数
*/

Dll_Export HHOOK SetHook( int hookType,HOOKPROC hookproc)
{
return SetWindowsHookEx(hookType, hookproc, instance, NULL);
}

/**/ /*
*功能:注销钩子
*hook -- 钩子句柄
*/
Dll_Export BOOL UnHook(HHOOK hook)
{
if (hook != NULL)
return UnhookWindowsHookEx(hook);
else
return 0 ;
}

然后在C#项目中创建一个系统钩子类,提供创建钩子和注销钩子的接口:
 

代码示例:

public class Hook
{
[DllImport( " LowLevelHook.dll " )]
public extern static IntPtr SetHook( int hookType, HookProc hookProc);

[DllImport( " LowLevelHook.dll " )]
public extern staticbool UnHook(IntPtr hook);
}

上面用到的User32.HookProc类型不是.NET框架提供的,是自己定义的一个委托类型,声明如下:
public delegate int HookProc( int nCode, IntPtr wParam, IntPtr lParam);
现在C#程序就可以使用各种系统钩子了,目前已经使用的有低级别鼠标钩子和低级别键盘钩子。

应用低级别鼠标钩子时会遇到这样一个问题:
低级别鼠标钩子的回调函数lParam是一个MSLLHOOKSTRUCT结构体指针,C#中怎么获取这个结构体的实例呢?
实现如下:
 

代码示例:
MSLLHOOKSTRUCT _mstr;
unsafe
{
_mstr =* (User32.MSLLHOOKSTRUCT * )lParam.ToPointer();
}
 

通过声明非安全代码来获取指针所指对象。

MSLLHOOKSTRUCT结构体的C#定义如下:
 

代码示例:
[StructLayout(LayoutKind.Sequential)]
public struct MSLLHOOKSTRUCT
{
public Point Point;
public int MouseData;
public int Flags;
public int Time;
public int ExtraInfo;
}   

    
 
 

您可能感兴趣的文章:

  • C# Timer定时器控件运行时需要修改系统时间的问题
  • C# 获取系统特殊文件夹路径的方法
  • 使用C#获取系统特殊文件夹路径的解决方法
  • C# 设置系统日期格式的方法
  • c#判断操作系统位数实例代码
  • c#判断操作系统位数的示例分享
  • C#获取系统版本信息方法
  • C# 获取系统进程的用户名
  • 系统进程用户名的获取方法(c#代码)
  • c# 获取系统版本信息的代码
  • c#不使用系统api实现可以指定区域屏幕截屏功能
  • C# 相对路径与系统路径
  • c#系统热键(快捷键)实现方法与代码
  • C# Winform 调用系统接口操作 INI 配置文件的代码
  • python下用os.execl执行centos下的系统时间同步命令ntpdate iis7站长之家
  • 配置C#的系统环境变量的方法
  • C# 系统热键注册实现代码
  • C#屏蔽ComboBox系统右键菜单的实现代码
  • c#使用filesystemwatcher监视文件系统的变化
  • C#中实现在32位、64位系统下自动切换不同的SQLite dll文件
  • Solaris系统下函数钩子如何实现!急急急。。。!!
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 高分寻求jsp代码(网上调查系统,新闻发布系统)就这点分了
  • 谁知道哪里有用java开发的管理信息系统软件(如:图书馆管理系统,人事部管理系统)的代码?
  • 求ps查看进程的系统 源代码
  • EXT2/EXT3文件系统的格式化代码在哪?
  • 高深问题:有了linux内核源代码如何做成一个linux操作系统
  • 求教,关于莱昂氏UNIX系统源代码的阅读
  • 源代码控制系统 SCCS
  • 谁有linux内核电源管理子系统的源代码?
  • 大家推荐几本详解Linux或unix 操作系统源代码的书籍!!!!
  • 源代码管理系统 uberSVN
  • Linux系统中有编译汇编源代码的工具吗?
  • 如何得到Linux的系统命令源代码,比如ping,mount,ls等?
  • 怎样找linux系统里面工具的源代码?比如fsck
  • 怎样从原代码安装LINUX系统
  • linux系统调用函数在下载的源代码的哪个文件夹下面
  • 我写的代码竟然让Linux系统重启了,可喜还是可悲?
  • 改动源代码之后,如何更新系统?
  • 请问哪里有linux操作系统的源代码下载?谢谢
  • Java源代码检索系统 JCite
  • 在LINUX系统下编译用户态的代码时提示undefined refirence to "函数名"错误请求帮助?谢谢!!
  • mount命令(linux操作系统)挂载卸载文件系统(cifs,光驱,nfs等)方法介绍
  • 问一个系统配置的问题:win2k系统能不能于SCO UNIX系统共存?
  • win7/Windows7系统下载地址搜集整理
  • unix下用java.util.Date取系统时间比直接在系统下用date命令查看系统时间早整整一个小时
  • Ubuntu查看系统信息命令介绍
  • windows 系统是否是多用户操作系统,如何理解“多用户操作系统”的“多用户”?
  • python下用os.execl执行centos下的系统时间同步命令ntpdate
  • 我现在想做一个权限管理系统,想让权限系统的利用性更强,我应该怎样设计权限系统呢.
  • 怎样重装win7系统?win7重装系统步骤详细图文介绍
  • 原来已安装好ubuntu,因系统崩溃,重装WINXP系统,如何再次登录ubuntu系统?
  • windows server2008上PowerBuilder程序系统错误解决方法


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3