windows API 钩子
使用键盘钩子,调用Win API 函数SetWindowHock。在Hock函数里进行处理。但是,无法勾住Ctrl+Alt+Del。因为他是底层实现的,必须使用键盘驱动才可以实现。 示例代码: C# code /************************* //定义变量 public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam); static int hKeyboardHook = 0; HookProc KeyboardHookProcedure; /************************* * 声明API函数 * ***********************/ // 安装钩子 (using System.Runtime.InteropServices;) [DllImport("user32.dll",CharSet=CharSet.Auto, CallingC.StdCall)] public static extern int SetWindowsHookEx(int idHook,HookProc lpfn, IntPtr hInstance, int threadId); // 卸载钩子 [DllImport("user32.dll",CharSet=CharSet.Auto, CallingC.StdCall)] public static extern bool UnhookWindowsHookEx(int idHook); // 继续下一个钩子 [DllImport("user32.dll",CharSet=CharSet.Auto, CallingC.StdCall)] public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam); // 取得当前线程编号(线程钩子需要用到) [DllImport("kernel32.dll")] static extern int GetCurrentThreadId(); //钩子子程:就是钩子所要做的事情 private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam) { if (nCode >= 0) { /**************** //线程键盘钩子判断是否按下键 Keys keyData = (Keys)wParam; if(lParam.ToInt32() > 0) { // 键盘按下 } if(lParam.ToInt32() < 0) { // 键盘抬起 } ****************/ /**************** //全局键盘钩子判断是否按下键 wParam = = 0x100 // 键盘按下 wParam = = 0x101 // 键盘抬起 ****************/ KeyMSG m = (KeyMSG) Marshal.PtrToStructure(lParam, typeof(KeyMSG));//键盘 // 在这里添加你想要做是事情(比如把键盘某些nCode忽略掉) return 0;//如果返回1,则结束消息,这个消息到此为止,不再传递。如果返回0或调用CallNextHookEx函数则消息出了这个钩子继续往下传递,也就是传给消息真正的接受者 } return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); } //键盘结构 public struct KeyMSG { public int vkCode; //键值 public int scanCode; public int flags; public int time; public int dwExtraInfo; } // 安装钩子 public void HookStart() { if(hKeyboardHook == 0) { // 创建HookProc实例 KeyboardHookProcedure = new HookProc(KeyboardHookProc); // 设置线程钩子 hKeyboardHook = SetWindowsHookEx( 13,KeyboardHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0); //************************************ //键盘线程钩子 //SetWindowsHookEx( 2,KeyboardHookProcedure, IntPtr.Zero, GetCurrentThreadId()); //GetCurrentThreadId() 为要监视的线程ID,你完全可以自己写个方法获取QQ的线程哦 //键盘全局钩子,需要引用空间(using System.Reflection;) //SetWindowsHookEx( 13,KeyboardHookProcedure,Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0); // //关于SetWindowsHookEx (int idHook, HookProc lpfn, IntPtr hInstance, int threadId)函数将钩子加入到钩子链表中,说明一下四个参数: //idHook 钩子类型,即确定钩子监听何种消息,上面的代码中设为2,即监听键盘消息并且是线程钩子,如果是全局钩子监听键盘消息应设为13, //线程钩子监听鼠标消息设为7,全局钩子监听鼠标消息设为14。 // //lpfn 钩子子程的地址指针。如果dwThreadId参数为0 或是一个由别的进程创建的线程的标识,lpfn必须指向DLL中的钩子子程。 除此以外,lpfn可 //以指向当前进程的一段钩子子程代码。钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。 // //hInstance应用程序实例的句柄。标识包含lpfn所指的子程的DLL。如果threadId 标识当前进程创建的一个线程,而且子程代码位于当前 //进程,hInstance必须为NULL。可以很简单的设定其为本应用程序的实例句柄。 // //threadedId 与安装的钩子子程相关联的线程的标识符。如果为0,钩子子程与所有的线程关联,即为全局钩子。 //************************************ // 如果设置钩子失败 if(hKeyboardHook == 0 ) { HookStop(); throw new Exception("SetWindowsHookEx failed."); } } } // 卸载钩子 public void HookStop() { bool retKeyboard = true; if(hKeyboardHook != 0) { retKeyboard = UnhookWindowsHookEx(hKeyboardHook); hKeyboardHook = 0; } if (!( retKeyboard)) throw new Exception("UnhookWindowsHookEx failed."); } //*****************************
windows API 钩子相关推荐
- C#低级Windows API钩子拦截键盘输入
一. 简介 猫和婴儿有很多共同之处.他们都喜欢吃家中养植的植物,都非常讨厌关门.他们也都爱玩弄你的键盘,结果是,你正发送给你的老板的电子邮件可能是以半截句子发送出去的,你的Excel帐户也被加入了一些 ...
- MinHook - 最小化的 x86/x64 API 钩子库
背景 对windows API钩子感兴趣的人都知道有一个优秀的库被微软命名为'Detours'.它真的很有用,但是它的免费版本(Express)是不支持X64.它的收费版本(Professional) ...
- windows api打开文件对话框
用windows api 写打开文件对话框主要使用OPENFILENAME ,GetOpenFileName, GetSaveFileName; 1.OPENFILENAME 结构体介绍:要使用Get ...
- Windows API 的数据类型与 Delphi 数据类型对照表
Windows API 的数据类型与 Delphi 数据类型对照表 Windows 数据类型 Delphi 数据类型 描述 LPSTR PAnsiChar 字符串指针 LPCSTR PAnsiChar ...
- 实践API钩子拦截DLL库调用
前言 在日常分析使用某个软件的过程中,如果我们想要去挖掘软件的漏洞.或者是通过打补丁的方式给软件增添一些新的功能,抑或是为了记录下软件运行过程中被调用的函数及其参数,有时候我们需要劫持对某些DLL库的 ...
- Windows API 大全
Windows API (包含了所有Windows API) Api函数名 函数说明 ...
- HOOK Windows API
HOOK Windows API 只能HOOK 本地的API,适用于入门学习 HOOK API的一般步骤: 1.定义假API函数 假API函数,除了函数名称和真API不一样之外,其它的都要跟真API的 ...
- c#调用windows api C#简单游戏外挂制作(以Warcraft Ⅲ为例)
C#简单游戏外挂制作(以Warcraft Ⅲ为例) 网上有很多外挂制作的教程,大多是讲针对大型网络游戏的,主要包含一些抓包.反汇编.C++的知识综合.事实也如此,常见的外挂都是使用VC++写的,从来没 ...
- Windows API(三)线程
Windows API笔记(一)内核对象 Windows API笔记(二)进程和进程间通信.进程边界 Windows API笔记(三)线程和线程同步.线程局部存储 Windows API笔记(三)线程 ...
最新文章
- BOS项目 第2天(BaseDao、BaseAction、用户登录、自定义strust登录拦截器)
- linux init.d添加启动脚本 ln,linux编写可运行的shell脚本并在其他目录创建ln连接与设置开机启动...
- js 打印的一些技巧 去除页眉页脚,主动分页
- 第二阶段第七次站立会议
- 计算机数值方法期末考试,《计算机数值方法》测试题二
- ICC_lab总结——ICC_lab6:版图完成
- 浅析微软的网关项目 -- ReverseProxy
- gt爵士变形步骤_代码广播简介:您可以编码为24/7的爵士节拍
- (转)三层相关案例(及常见的错误)
- 1m带宽可以做mysql数据库吗_服务器的1M带宽够用吗?1M网速是多少?
- JEECG开源说明:JEECG 完全开源,不收任何费用,可以任用于商业!
- 信息学奥赛一本通(1114:白细胞计数)
- linux下共享库的制作及常见的问题
- html5+css3方式实现mobie app的一些瓶颈
- 再述:python中redis的使用(Pool)
- 《三桃演义》第二回:返航,火星人柯里昂
- DB2数据库认证系列教程——IBM DB2认证考前必备
- h3c无线管理 dns服务器,H3C FIT AP与AC连接时三种的注册流程
- 苹果homekit,homeassistant,谷歌等智能生态系统,哪一款更加适合你?
- [CTFSHOW]中期测评WP(差512和514)