关于钩子
请参见微软中国社区中《HOOK专题》一文。
纯C#钩子(Hook)实现
要实现系统钩子其实很简单,调用三个Win32的API即可。
SetWindowsHookEx 用于设置钩子。(设立一道卡子,盘查需要的信息)
[DllImport("user32.dll",CallingConvention=CallingConvention.StdCall)]
publicstaticexternIntPtrSetWindowsHookEx(WH_CodesidHook,HookProclpfn,
IntPtrpInstance,intthreadId);
publicstaticexternIntPtrSetWindowsHookEx(WH_CodesidHook,HookProclpfn,
IntPtrpInstance,intthreadId);
CallNextHookEx 用于传递钩子(消息是重要的,所以从哪里来,就应该回到哪里去,除非你决定要封锁消息)
[DllImport("user32.dll",CallingConvention=CallingConvention.StdCall)]
publicstaticexternintCallNextHookEx(IntPtrpHookHandle,intnCode,
Int32wParam,IntPtrlParam);
publicstaticexternintCallNextHookEx(IntPtrpHookHandle,intnCode,
Int32wParam,IntPtrlParam);
UnhookWindowsHookEx 卸载钩子(卸载很重要,卡子设多了会造成拥堵)
[DllImport("user32.dll",CallingConvention=CallingConvention.StdCall)]
publicstaticexternboolUnhookWindowsHookEx(IntPtrpHookHandle);
publicstaticexternboolUnhookWindowsHookEx(IntPtrpHookHandle);
在《HOW TO:在 Visual C# .NET 中设置窗口挂钩》一文中有如下描述:
在.NET框架中不支持全局挂钩
您无法在Microsoft.NET框架中实现全局挂钩。若要安装全局挂钩,挂钩必须有一个本机动态链接库(DLL)导出以便将其本身插入到另一个需要调入一个有效而且一致的函数的进程中。这需要一个DLL导出,而.NET框架不支持这一点。托管代码没有让函数指针具有统一的值这一概念,因为这些函数是动态构建的代理。
网上查找了很多代码,大都另外包含了一个C++的DLL,用于标识包含lpfn所指的子程的DLL,似乎也验证了这一说法。您无法在Microsoft.NET框架中实现全局挂钩。若要安装全局挂钩,挂钩必须有一个本机动态链接库(DLL)导出以便将其本身插入到另一个需要调入一个有效而且一致的函数的进程中。这需要一个DLL导出,而.NET框架不支持这一点。托管代码没有让函数指针具有统一的值这一概念,因为这些函数是动态构建的代理。
但实际上并非如此,使用如下代码即可实现全局钩子:
IntPtrpInstance=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方法的参数,来获得合适的句柄指针。
Win32API.SetWindowsHookEx( WH_MOUSE_LL,m_MouseHookProcedure,pInstance,0);
钩子应用DEMO-屏幕放大器
点击下载可执行文件(Shift + Esc 退出程序) http://files.cnblogs.com/sharkoo/screenmagnifierexe.rar
点击下载源文件 http://files.cnblogs.com/sharkoo/screenmagnifier.rar
所谓屏幕放大器,类似与WINDOWS系统中的辅助工具中的放大镜。
前两天在找资料的时候突然发现在2.0中,Graphics类多了一个CopyFromScreen方法,可以直接实现屏幕抓取,于是有了做屏幕放大器的想法。
首先我定义了是SKHOOK类,来截取键盘及鼠标。
由于需要获得全局的鼠标消息来确定截屏位置,同时要建立一个全局的快捷键来退出程序,所以只能用上面说的钩子来实现。
然后我通过鼠标点来设置采样区域,以及窗体的位置。
采样区域为鼠标点为中心的50*50的矩形区域。窗体位置只实现了简单的鼠标跟随,同时保证了和采样区域不重叠。
另外我使用了一个BackgroundWorker来定时刷新更新窗体。主要是为了实现动画内容(GIF、Flash等)的显示。
至于移动的时候使用SetWindowPos,主要是为了保证窗体一直位于顶层,否则的话一些置顶的窗口(如QQ)等将覆盖当前窗口。
已知问题:
1。不支持视频截取
2。部分ToolTip提示无法显示
3。可能会造成背景窗口部分显示失效。
4。SKHook类中,对于键盘事件处理,存在不足。
还有一个问题,就是当鼠标移动比较快的时候,窗口边框会有残影,不知道是什么原因。这个问题在以往的Fram窗体中一直是困扰我的问题,至今没有找到解决的办法。
相关推荐
C#中也可以通过调用Win32 API安装和卸载钩子函数,实现基于钩子的特定功能。 本实例为通过C#屏蔽键盘、利用HOOK钩子屏蔽ctrl+alt+delete组合键的示例源码,可直接编译。 示例支持屏蔽按键、解除屏蔽。
C# 通过钩子原理实现对USB扫码枪驱动,亲测有效,这个是我已经运用到项目开发软件中的一个子功能,拿出来和大家分享下!
使用C#编写的源码,内含4个工具类(键盘监控、键盘输入、鼠标监控、鼠标输入),根据需要自己调用,窗口程序仅做实例效果参考,VS2015,64位win10实测可用,目前尚未实现驱动级,编写外挂可能不会有效果
C#中使用 Hook 的例子...
主要是C#技术,对钩子原理的一种应用,软件版本VS.NET2010 能够捕获键盘,存在C盘的a.txt文件。对理解钩子原理,有一定的帮助
c# 钩子函数 屏蔽键盘
在C#中,我们可以使用钩子函数来拦截Windows操作系统产生的一些事件,例如鼠标、键盘或者窗口事件等。其中,窗口消息钩子(WH_CALLWNDPROC)是一种比较常见的钩子函数,它能够拦截窗口消息,并允许应用程序修改或阻止...
~~~~~c#钩子程序讲解例子.doc~~~~~~~~
C#钩子例子原代码,在代码的初级阶段,欢迎和大家一起分享
强大的C#钩子。全局钩子,获取全局键盘输入值输入值。 由于键盘键值和ascll码值不对应,本程序已做处理 后台安静运行。
C# winform键盘钩子示例 1.注册简单,两步实现一个快捷键与功能:组合键字符串(如:Ctrl+A)、执行事件设置; 2.可注册多个快捷键 3.可动态注册
c# 钩子记录鼠标运行轨迹c# 钩子记录鼠标运行轨迹 c# 钩子记录鼠标运行轨迹c# 钩子记录鼠标运行轨迹c# 钩子记录鼠标运行轨迹 c# 钩子记录鼠标运行轨迹
C# 钩子 程序(DLL) 编译后引用 源码内有使用说明
c#系统钩子(c#源码),很好的钩子的实例。
c#钩子获取键盘消息 这个是别人写的,我拿来试了试,虽然依然不是很明白,但既然已实现功能,就放在这里吧。
c# 全局钩子之键盘(实例) 内含键盘钩子+ 鼠标钩子
C#钩子程序 几乎捕获键盘鼠标所有事件,仅供学习
c# 钩子控制鼠标移动, 运行后设置a 设置b,运行可看到效果,点鼠标右键,退出
c# 钩子 闪屏 关机 源代码加程序包 对c#感兴趣的朋友可以看看哦!!!!