键盘钩子

C#键盘钩子//*************************键盘钩子********************** //定义变量 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."); } //*****************************

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

matplotlib基础函数函数 plot, figure

matplotlib.pyplot.plot(*args, scalexTrue, scaleyTrue,dataNone,**kwargs) 用线段和标记去绘制x和y。调用签名&#xff1a; plot([x], y, [fmt], *, dataNone, **kwargs) plot([x], y, [fmt], [x2], y2, [fmt2], ..., **kwargs)点或线的坐标由x, y给出 操作参数 fmt 是为了…

清洁数据ploy n_清洁屋数据

清洁数据ploy nAs a bootcamp project, I was asked to analyze data about the sale prices of houses in King County, Washington, in 2014 and 2015. The dataset is well known to students of data science because it lends itself to linear regression modeling. You …

redis安装redis集群

NoSql数据库之Redis1、什么是nosql&#xff0c;nosql的应用场景2、Nonsql数据库的类型a) Key-valueb) 文档型&#xff08;类似于json&#xff09;c) 列式存储d) 图式3、redis的相关概念kv型的。4、Redis的安装及部署5、Redis的使用方法及数据类型a) Redis启动及关闭b) Redis的数…

联想拯救者y7000p加内存条_内存、硬盘不够用?手把手教你升级联想拯救者Y7000P...

由于这两年内存价格的高企&#xff0c;主流笔记本的内存容量被锁定在 8GB 已经有了相当长的时间。作为近几个月最热门的游戏本产品&#xff0c;联想拯救者 Y7000P 除顶配之外同样使用的是 8GB 内存和 512GB 固态硬盘的配置。所以买到这款机器的玩家多数都会选择进行内存和硬盘的…

机器学习实践一 logistic regression regularize

Logistic regression 数据内容&#xff1a; 两个参数 x1 x2 y值 0 或 1 Potting def read_file(file):data pd.read_csv(file, names[exam1, exam2, admitted])data np.array(data)return datadef plot_data(X, y):plt.figure(figsize(6, 4), dpi150)X1 X[y 1, :]X2 X[…

ajax+webservice

版本为AJAX November CTP 三个示例分别为&#xff1a;1 带参数的WS方法2 不带参数的WS方法3 参数类型为DataTable的WS方法 一、WebMethod注意要点&#xff1a;1 WebMethod类需要添加命名空间 Microsoft.Web.Script.Services&#xff0c;此空间需要引用Microsoft.Web.Preview.dl…

深度学习数据扩张_适用于少量数据的深度学习结构

作者&#xff1a;Gorkem Polat编译&#xff1a;ronghuaiyang导读一些最常用的few shot learning的方案介绍及对比。传统的CNNs (AlexNet, VGG, GoogLeNet, ResNet, DenseNet…)在数据集中每个类样本数量较多的情况下表现良好。不幸的是&#xff0c;当你拥有一个小数据集时&…

时间管理

时间管理 时间管理是运用策略和技术&#xff0c;帮助你尽可能有效地利用你的时间。 不仅仅是要将时间用在正确的地方&#xff0c; 而且还要将尽可能有效地加以利用。 目前是如何利用时间的&#xff1a; 意识是时间管理的先决条件。目标提供路线图。选择是难点。 意识 第一条…

基于边缘计算的实时绩效_基于绩效的营销中的三大错误

基于边缘计算的实时绩效We’ve gone through 20% of the 21st century. It’s safe to say digitalization isn’t a new concept anymore. Things are fully or at least mostly online, and they tend to escalate in the digital direction. That’s why it’s important to…

本线程钩子

钩子其实就是调用一下API而已&#xff1a; 1、安装钩子&#xff1a;   SetWindowsHookEx 函数原形&#xff1a;HHOOK SetWindowsHookEx( int idHook, // 钩子类型&#xff0c; HOOKPROC lpfn, // 钩子函数地址…

Maven Web项目解决跨域问题

跨域问题目前笔者所用到的方案大致有三种:jsonp,SpringMVC 4以上注解方式和cros三方过滤器。 Jsonp JSONP(JSON with Padding)是一个非官方的协议&#xff0c;它允许在服务器端集成Script tags返回至客户端&#xff0c;通过javascript callback的形式实现跨域访问&#xff08;这…

为什么Facebook的API以一个循环作为开头?

作者 | Antony Garand译者 | 无明如果你有在浏览器中查看过发给大公司 API 的请求&#xff0c;你可能会注意到&#xff0c;JSON 前面会有一些奇怪的 JavaScript&#xff1a;为什么他们会用这几个字节来让 JSON 失效&#xff1f;为了保护你的数据 如果没有这些字节&#xff0c;那…

城市轨道交通运营票务管理论文_城市轨道交通运营管理专业就业前景怎么样?中职优选告诉你...

​​城市轨道交通运营管理专业&#xff0c;专业就业前景怎么样&#xff1f;就业方向有哪些&#xff1f;有很多同学都感觉很迷忙&#xff0c;为了让更多的同学们了解城市轨道交通运营管理专业的就业前景与就业方向&#xff0c;整理出以下内容希望可以帮助同学们。城市轨道交通运…

计算机视觉对扫描文件分类 OCR

通过计算机视觉对扫描文件分类 一种解决扫描文档分类问题的深度学习方法 在数字经济时代&#xff0c; 银行、保险、治理、医疗、法律等部门仍在处理各种手写票据和扫描文件。在业务生命周期的后期&#xff0c; 手动维护和分类这些文档变得非常繁琐。 对这些非机密文档进行简…

从钱龙数据中读取股票权息信息导入到数据库

从钱龙数据中读取股票权息信息导入到数据库 前面写了如果读股票代码和日线数据&#xff0c;下面是如何读股票的权息信息。 钱龙中权息数据存储在QLDATA/history/shase/weight和QLDATA/history/sznse/weight目录下&#xff0c;每个文件对应一只股票。 与前文一样&#xff0c;只贴…

笑话生成器_爸爸笑话发生器

笑话生成器(If you’re just here for the generated jokes, scroll down to the bottom!)(如果您只是在这里生成笑话&#xff0c;请向下滚动到底部&#xff01;) I thought: what is super easy to build, yet would still get an approving chuckle if someone found it on …

AWS Amplify Console:赋予应用程序快速部署的能力

AWS re:Invent 2018大会发布了很多新功能和服务&#xff0c;包括新的AWS Amplify Console&#xff0c;一种针对移动Web应用程序的持续部署服务。 AWS Amplify Console承诺可以支持快速发布新功能&#xff0c;避免在部署应用程序时停机&#xff0c;并降低同时更新应用程序客户端…

机器学习实践二 -多分类和神经网络

本次练习的任务是使用逻辑归回和神经网络进行识别手写数字&#xff08;form 0 to 9, 自动手写数字问题已经应用非常广泛&#xff0c;比如邮编识别。 使用逻辑回归进行多分类分类 练习2 中的logistic 回归实现了二分类分类问题&#xff0c;现在将进行多分类&#xff0c;one vs…

Hadoop 倒排索引

倒排索引是文档检索系统中最常用的数据结构&#xff0c;被广泛地应用于全文搜索引擎。它主要是用来存储某个单词&#xff08;或词组&#xff09;在一个文档或一组文档中存储位置的映射&#xff0c;即提供了一种根据内容来查找文档的方式。由于不是根据文档来确定文档所包含的内…

koa2异常处理_读 koa2 源码后的一些思考与实践

koa2的特点优势什么是 koa2Nodejs官方api支持的都是callback形式的异步编程模型。问题&#xff1a;callback嵌套问题koa2 是由 Express原班人马打造的&#xff0c;是现在比较流行的基于Node.js平台的web开发框架&#xff0c;Koa 把 Express 中内置的 router、view 等功能都移除…