C#使用Windows全局钩子(Winform) SetWindowsHookEx
注1:未作特殊标注请不要修改方法名称,引入的方法为系统定义
注2:代码按步骤直接复制就可用
使用windows全局钩子需要用到的3个主要外部函数
SetWindowsHookEx()
CallNextHookEx()
UnWindowsHookEx()
通过[DllImport()]导入
导入动态链接库并定义函数
using System.Runtime.InteropServices;//DllImport方法//定义SetWindowsHookEx
[DllImport("user32")]
//参数列表:idHook-钩子类型,lpfn-钩子函数委托,hmod-窗口句柄,dwThreadId-监控的线程数
public static extern int SetWindowsHookEx(int idHook, HOOKPROC lpfn, IntPtr hmod, int dwThreadId);
//定义CallNextHookEx
[DllImport("user32")]
//参数列表:hhk-WindowsHookEx的返回值,nCode-
public static extern int CallNextHookEx(int hhk, int nCode, int wParam, IntPtr lParam);
//定义UnhookWindowsHookEx
[DllImport("user32")]
//参数列表:hhk-WindowsHookEx的返回值
public static extern bool UnhookWindowsHookEx(int hhk);
定义HOOKPROC
类型的委托
SetWindowsHookEx()
方法的第二个参数
//声明一个HOOKPROC类型的委托
public delegate int HOOKPROC(int code, int wParam, IntPtr lParam);
在做下一步之前要先引用WindowsBase.dll文件
接着做下一步
定义委托指向的方法,以获取键盘按键为例
HookProcMathodKeyBoard()
这个方法的名称是随意的
//定义委托指向的方法(键盘)using System.Runtime.InteropServices;//Marshal类using System.Windows.Input;//KeyInterop类,添加WindowBase.dll文件后才可以使用const int WM_KEYDOWN = 0x0100;//键盘按键按下对应的值
const int WM_KEYUP = 0x0101;//键盘按键抬起对应的值public int HookProcMathodKeyBoard(int code, int wParam, IntPtr lParam)
{tagKBDLLHOOKSTRUCT v = (tagKBDLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(tagKBDLLHOOKSTRUCT));//将捕获的键盘信息存储到存储键盘信息的结构体中Key key =KeyInterop.KeyFromVirtualKey(v.vkCode);//将键盘信息转换成C#中可用的键if (code >= 0)//如果code的值大于0说明获取到了按键输入{if (wParam == WM_KEYDOWN)//检测到键盘按下{if (key.ToString() == "Q"){MessageBox.Show("按下");}//要执行的代码段}if (wParam == WM_KEYUP)//检测到键盘抬起{if (key.ToString() == "Q"){MessageBox.Show("抬起");}//要执行的代码段}}return CallNextHookEx(SetWindowsHookExReturnKeyBoard, code, wParam, lParam);//将按键值传
//递给下一个钩子
}
定义存储键盘信息的结构体tagKBDLLHOOKSTRUCT
using System.Runtime.InteropServices;[StructLayout(LayoutKind.Sequential)]
public class tagKBDLLHOOKSTRUCT
{public int vkCode;//虚拟键盘码public int scanCode;public int flags;public int time;public IntPtr dwExtraInfo;}
定义获取窗体句柄的方法GetModuleHandle()
using System.Runtime.InteropServices;[DllImport("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string lpModuleName);
最后使用
using System.Diagnostics;//Process、ProcessModulepublic int SetWindowsHookExReturnKeyBoard;//声明一个//窗体加载的时候启用钩子
public Form1()
{InitializeComponent();HOOKPROC _keyBoard = new HOOKPROC(HookProcMathodKeyBoard);//创建委托变量Process curProcess = Process.GetCurrentProcess();//获取窗体句柄ProcessModule curModule = curProcess.MainModule;SetWindowsHookExReturnKeyBoard = SetWindowsHookEx(13, _keyBoard, GetModuleHandle(curModule.ModuleName), 0);//窗体加载的时候启用键盘钩子
}
//窗体关闭时关闭钩子
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{UnhookWindowsHookEx(SetWindowsHookExReturnKeyBoard);//该函数的参数是SetWindowsHookEx函数的//返回值
}
C#使用Windows全局钩子(Winform) SetWindowsHookEx相关推荐
- Windows 全局钩子 Hook 详解
监控程序的实现 我们发现一些木马或其他病毒程序常常会将我们的键盘或鼠标的操作消息记录下来然后再将它发到他们指定的地方以实现监听.这种功能其他是利用了全局钩子将鼠标或键盘消息进行了截取,从而 ...
- 使用Windows全局钩子打造键盘记录器
简介 键盘记录功能一直是木马等恶意软件窥探用户隐私的标配,那么这个功能是怎么实现的呢?在Ring3级下,微软就为我们内置了一个Hook窗口消息的API,也就是SetWindowsHookEx函数,这个 ...
- 练习 进程钩子 全局钩子
C++ 关于钩子的知识点博客网上基本写的都非常详细,这里只是简单分享一下本人练手的编程步骤和一些简单认识. 钩子程序就大概分成了2种: (1) 进程中的钩子:它 的作用范围只是限定在某个进程中,或者某 ...
- windows全局消息钩子的一个BUG
Windows操作系统全局消息钩子Bug 场景: Process A与Process B是同一个程序的两个实例, 1. 两个进程都设置了WH_CBT消息钩子,钩子的消息处理都在TSVulFw.dat模 ...
- [C#.Net]全局钩子实现USB扫码枪无焦点状态下扫入
[C#.Net]全局钩子实现USB扫码枪无焦点状态下扫入 [C#.Net]全局钩子实现USB扫码枪无焦点状态下扫入 [C#.Net]全局钩子实现USB扫码枪无焦点状态下扫入 1.扫描枪获取数据原理基本 ...
- windows下钩子的使用
我们知道Windows中的窗口程序是基于消息,由事件驱动的,在某些情况下可能需要捕获或者修改消息,从而完成一些特殊的功能(MFC框架就利用Windows钩子对消息进行引导).对于捕获消息而言,无法使用 ...
- Delphi中使用全局钩子
[转载] Delphi中使用全局钩子 Delphi中使用全局钩子 DLL代码: unit UnitDll; interface uses Windows; const BUFFER_SIZE = 16 ...
- C#低级Windows API钩子拦截键盘输入
一. 简介 猫和婴儿有很多共同之处.他们都喜欢吃家中养植的植物,都非常讨厌关门.他们也都爱玩弄你的键盘,结果是,你正发送给你的老板的电子邮件可能是以半截句子发送出去的,你的Excel帐户也被加入了一些 ...
- VC++ Hook截取鼠标点击窗口消息的问题!全局钩子
VC++ Hook截取鼠标点击窗口消息的问题!全局钩子,高手进! 悬赏分:0 - 提问时间: 2010年05月19日 06时20分 我在做毕业设计,现在遇到一个问题,像求教高手: 我想实现如下功能,当 ...
- MFC 全局钩子dll注入监听键盘消息
MFC自带的键盘监听功能只有焦点在MFC程序界面时才能监听键盘消息,要想在MFC程序界面外监听键盘消息,可以通过DLL注入使用全局钩子来监听.首先,通过Visual Studio生成全局钩子的动态库, ...
最新文章
- HDU 1247 Hat’s Words
- 终于有人能把Telnet跟SNMP讲明白了
- 网站数据是怎么存取在mysql_数据是怎么存储在mysql?
- C#连接数据库PostSQL-NpgSQL
- 悲催的一下午:怎么删除360。。。
- Fastjson实用工具类,List转JSONString,List转JSONArray,JSONArray转List,JSONArray转ArrayList,JSONObject转HashMap
- 安装mysql电脑开机蓝屏_电脑开机蓝屏怎么解决。
- 使用python实现简单网页图片抓取
- 荧光和明场图像融合 matlab,一种用于明场显微成像的多层图像融合算法
- 【代码审计】--- php代码审计方法
- 武器装备科研生产单位保密资格标准》内容试题(2017年版)( 共 331 题 )
- php 屏蔽搜索机器人,php实现判断访问来路是否为搜索引擎机器人的方法
- 四万字32图,Kafka知识体系保姆级教程宝典
- 计算机专业英语词组,《计算机专业英语词组.doc
- 究竟线框图为什么要画,以及如何画
- 西门子224/226源码 PLC源码 S7 200源代码 ,测试过一些基础的功能
- 【可解释性机器学习】详解Python的可解释机器学习库:SHAP
- 更深入理解 Python 中的迭代
- matlab lzc,人脸分割 matlab程序
- 数字Numeric与单位units,建筑师编程指南之SketchUp插件开发 4