纯C#钩子实现及应用(转)

简介:

纯C#钩子(Hook)实现

要实现系统钩子其实很简单,调用三个Win32的API即可。
SetWindowsHookEx  用于设置钩子。(设立一道卡子,盘查需要的信息)
        [DllImport( "user32.dll", CallingConvention = CallingConvention.StdCall )]
         public  static  extern IntPtr SetWindowsHookEx ( WH_Codes idHook, HookProc lpfn,
            IntPtr pInstance,  int threadId );

CallNextHookEx 用于传递钩子(消息是重要的,所以从哪里来,就应该回到哪里去,除非你决定要封锁消息)

        [DllImport( "user32.dll", CallingConvention = CallingConvention.StdCall )]
         public  static  extern  int CallNextHookEx ( IntPtr pHookHandle,  int nCode,
            Int32 wParam, IntPtr lParam );

UnhookWindowsHookEx 卸载钩子(卸载很重要,卡子设多了会造成拥堵)

        [DllImport( "user32.dll", CallingConvention = CallingConvention.StdCall )]
         public  static  extern  bool UnhookWindowsHookEx ( IntPtr pHookHandle );

在《HOW TO:在 Visual C# .NET 中设置窗口挂钩》一文中有如下描述:
在 .NET 框架中不支持全局挂钩
您无法在 Microsoft .NET 框架中实现全局挂钩。若要安装全局挂钩,挂钩必须有一个本机动态链接库 (DLL) 导出以便将其本身插入到另一个需要调入一个有效而且一致的函数的进程中。这需要一个 DLL 导出,而 .NET 框架不支持这一点。托管代码没有让函数指针具有统一的值这一概念,因为这些函数是动态构建的代理。
网上查找了很多代码,大都另外包含了一个C++的DLL,用于标识包含lpfn所指的子程的DLL,似乎也验证了这一说法。

但实际上并非如此,使用如下代码即可实现全局钩子:
IntPtr pInstance = Marshal.GetHINSTANCE( Assembly.GetExecutingAssembly().ManifestModule );
Win32API.SetWindowsHookEx( WH_MOUSE_LL,m_MouseHookProcedure, pInstance, 0 );
注:ManifestModule属性是.Net Framework 2.0中新增加的,所以当你依然使用.Net Framework 1.x的时候,可以使用GetModules方法获取当前程序集的所有模块,然后用其中的一个作为GetHINSTAN方法的参数,来获得合适的句柄指针。  

钩子应用DEMO-屏幕放大器 

点击下载可执行文件Shift + Esc 退出程序)
点击下载源文件

所谓屏幕放大器,类似与WINDOWS系统中的辅助工具中的放大镜。
前两天在找资料的时候突然发现在2.0中,Graphics类多了一个CopyFromScreen方法,可以直接实现屏幕抓取,于是有了做屏幕放大器的想法。

首先我定义了是SKHOOK类,来截取键盘及鼠标。
由于需要获得全局的鼠标消息来确定截屏位置,同时要建立一个全局的快捷键来退出程序,所以只能用上面说的钩子来实现。

然后我通过鼠标点来设置采样区域,以及窗体的位置。
采样区域为鼠标点为中心的50*50的矩形区域。窗体位置只实现了简单的鼠标跟随,同时保证了和采样区域不重叠。

另外我使用了一个BackgroundWorker来定时刷新更新窗体。主要是为了实现动画内容(GIF、Flash等)的显示。

至于移动的时候使用SetWindowPos,主要是为了保证窗体一直位于顶层,否则的话一些置顶的窗口(如QQ)等将覆盖当前窗口。

已知问题:
1。不支持视频截取
2。部分ToolTip提示无法显示
3。可能会造成背景窗口部分显示失效。
4。SKHook类中,对于键盘事件处理,存在不足。

还有一个问题,就是当鼠标移动比较快的时候,窗口边框会有残影,不知道是什么原因。这个问题在以往的Fram窗体中一直是困扰我的问题,至今没有找到解决的办法。




本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/archive/2009/05/26/1489386.html,如需转载请自行联系原作者
相关文章
|
9天前
|
开发框架 Linux C#
C#编程的跨平台应用
【4月更文挑战第21天】C#与.NET Core的结合使得跨平台应用开发变得高效便捷,提供统一编程模型和高性能。丰富的类库、活跃的社区支持及Visual Studio Code、Xamarin等工具强化了其优势。广泛应用在企业系统、云服务和游戏开发中,虽面临挑战,但随着技术进步,C#在跨平台开发领域的前景广阔。
|
8月前
|
编译器 C# 数据库
C#之二十二 WIN应用程序的安装部署
C#之二十二 WIN应用程序的安装部署
36 0
|
4月前
|
程序员 C#
C# 面向对象编程进阶:构造函数详解与访问修饰符应用
构造函数是一种特殊的方法,用于初始化对象。构造函数的优势在于,在创建类的对象时调用它。它可以用于为字段设置初始值
47 1
|
4月前
|
C#
C# 运算符详解:包含算术、赋值、比较、逻辑运算符及 Math 类应用
运算符用于对变量和值执行操作。在C#中,有多种运算符可用,包括算术运算符、关系运算符、逻辑运算符等。
50 1
|
4月前
|
Java 程序员 C#
C# 介绍、应用领域、入门、语法、输出和注释详解
C#(发音为“C-Sharp”)是一种由 Microsoft 创建的面向对象的编程语言,运行在 .NET Framework 上。源于 C 家族,与流行的语言如 C++ 和 Java 相近。首个版本发布于 2002 年,而最新版本,C# 12,于 2023 年 11 月发布
68 0
|
9月前
|
监控 C# C++
Baumer工业相机堡盟相机如何使用HDR高动态范围功能( HDR功能的优点和行业典型应用)(C++)(C#)
Baumer工业相机堡盟相机如何使用HDR高动态范围功能( HDR功能的优点和行业典型应用)(C++)(C#)
131 0
|
9月前
|
存储 算法 自动驾驶
Baumer工业相机堡盟相机如何使用JPEG图像压缩功能(LXT.JP系列相机图像压缩功能的使用和优点以及行业应用)(C#)
Baumer工业相机堡盟相机如何使用JPEG图像压缩功能(LXT.JP系列相机图像压缩功能的使用和优点以及行业应用)(C#)
61 0
|
5月前
|
C# Windows
C#安装“Windows 窗体应用(.NET Framework)”
C#安装“Windows 窗体应用(.NET Framework)”
53 0
|
5月前
|
BI C# 数据安全/隐私保护
C# 字符串常用方法的详细讲解和应用
C# 字符串常用方法的详细讲解和应用
|
8月前
|
Oracle 架构师 关系型数据库
C#反射应用之实现动态可配置可扩展框架的简单示例
C#反射应用之实现动态可配置可扩展框架的简单示例