1.引入

由于需要使用动态链接库及Process进程类,所以需要在项目中引入命名空间

using System.Diagnostics;

using System.Runtime.InteropServices;   //调用操作系统动态链接库

2.键盘屏蔽

实现屏蔽键盘的功能,并且把按的任意的一个键的值显示在标签中。

如 按下了 space windows 等,不会产生键盘该有的功能,因为做了屏蔽处理,而是显示键值在标签上。

代码如下:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices; //调用操作系统动态链接库
using System.Windows.Forms;namespace WindowsFormsApp14 {public partial class Form1 : Form {private KeyboardHookLib _keyboardHook = null;public Form1() {InitializeComponent();}//开启改键private void button1_Click(object sender, EventArgs e) {
//把客户端委托函数传给键盘钩子类KeyBoardHookLib_keyboardHook.InstallHook(this.Form1_KeyPress);}//退出改键private void button2_Click(object sender, EventArgs e) {if (_keyboardHook != null) {_keyboardHook.UninstallHook();}}private void Form1_Load(object sender, EventArgs e) {}//窗口退出事件private void Form1_FormClosed(object sender, FormClosedEventArgs e) {if (_keyboardHook != null) {//卸载钩子_keyboardHook.UninstallHook();}}//右键菜单-与此例无关private void Form1_MouseDoubleClick(object sender, MouseEventArgs e) {if (WindowState == FormWindowState.Minimized) {//还原窗体显示WindowState = FormWindowState.Normal;//激活窗体并给予它焦点this.Activate();}}//客户端传递的委托函数private void Form1_KeyPress(KeyboardHookLib.HookStruct hookStruct, out bool handle) {handle = false; //预设不拦截Keys key = (Keys)hookStruct.vkVode;String keyname = key.ToString();this.showresult.Text = keyname;return;}}/class KeyboardHookLib {//钩子类型:键盘private const int WH_KEYBOARD_LL = 13; //全局钩子键盘为13,线程钩子键盘为2private const int WM_KEYDOWN = 0x0100; //键按下private const int WM_KEYUP = 0x0101; //键弹起//全局系统按键private const int WM_SYSKEYDOWN = 0x104;//键盘处理委托事件,捕获键盘输入,调用委托方法private delegate int HookHandle(int nCode, int wParam, IntPtr lParam);private static HookHandle _keyBoardHookProcedure;//客户端键盘处理委托事件public delegate void ProcessKeyHandle(HookStruct param, out bool handle);private static ProcessKeyHandle _clientMethod = null;//接收SetWindowsHookEx返回值   判断是否安装钩子private static int _hHookValue = 0;//Hook结构 存储按键信息的结构体[StructLayout(LayoutKind.Sequential)]public class HookStruct {public int vkVode;public int scanCode;public int flags;public int time;public int dwExtraInfo;}//安装钩子//idHook为13代表键盘钩子为14代表鼠标钩子,lpfn为函数指针,指向需要执行的函数,hIntance为指向进程快的指针,threadId默认为0就可以了[DllImport("user32.dll")]private static extern int SetWindowsHookEx(int idHook, HookHandle lpfn, IntPtr hInstance, int threadId);//取消钩子[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern bool UnhookWindowsHookEx(int idHook);//调用下一个钩子[DllImport("user32.dll")]public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);//获取当前线程id[DllImport("kernel32.dll")]public static extern int GetCurrentThreadId();//通过线程Id,获取进程快[DllImport("kernel32.dll")]public static extern IntPtr GetModuleHandle(String name);private IntPtr _hookWindowPtr = IntPtr.Zero;public KeyboardHookLib() { }#region//加上客户端方法的委托的安装钩子public void InstallHook(ProcessKeyHandle clientMethod) {//客户端委托事件 _clientMethod = clientMethod;//安装键盘钩子if (_hHookValue == 0) {_keyBoardHookProcedure = new HookHandle(GetHookProc);_hookWindowPtr = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);_hHookValue = SetWindowsHookEx(WH_KEYBOARD_LL,_keyBoardHookProcedure,_hookWindowPtr,0);if (_hHookValue == 0) {//设置钩子失败UninstallHook();}}}#endregion//取消钩子事件public void UninstallHook() {if (_hHookValue != 0) {bool ret = UnhookWindowsHookEx(_hHookValue);if (ret) {_hHookValue = 0;}}}private static int GetHookProc(int nCode, int wParam, IntPtr lParam) {//当nCode大于0,并且时按下事件时为1if (nCode >= 0 && (wParam == WM_KEYDOWN) || (wParam == WM_KEYDOWN)) {//将按键信息转换为结构体HookStruct hookStruc = (HookStruct)Marshal.PtrToStructure(lParam, typeof(HookStruct));//是否拦截按键的标识符,默认不拦截bool handle = false;//客户端调用  _clientMethod(hookStruc,out handle); //如果传递了客户端委托,就调用handle = true; //如果这个handle为false,则代表不拦截此次按键,按了 windows等键会执行客户端键值显示,但是同时也会产生该键本有的功能。if (handle){ return 1; }}return CallNextHookEx(_hHookValue, nCode, wParam, lParam);}}}

3.全局改键

这个案例是把键盘的UP键改成了 回车键加greendisgood 1000多个字符键再加一个回车键,玩过魔兽的都知道这是魔兽秘籍。

using System;
using System.Diagnostics;
using System.Runtime.InteropServices; //调用操作系统动态链接库
using System.Windows.Forms;namespace WindowsFormsApp14 {public partial class Form1 : Form {private KeyboardHookLib _keyboardHook = null;public Form1() {InitializeComponent();}//开启改键private void button1_Click(object sender, EventArgs e) {_keyboardHook = new KeyboardHookLib();_keyboardHook.InstallHook();}//退出改键private void button2_Click(object sender, EventArgs e) {if (_keyboardHook != null) {_keyboardHook.UninstallHook();}}private void Form1_Load(object sender, EventArgs e) {}//窗口退出事件private void Form1_FormClosed(object sender, FormClosedEventArgs e) {if (_keyboardHook != null) {//卸载钩子_keyboardHook.UninstallHook();}}//右键菜单private void Form1_MouseDoubleClick(object sender, MouseEventArgs e) {if (WindowState == FormWindowState.Minimized) {//还原窗体显示WindowState = FormWindowState.Normal;//激活窗体并给予它焦点this.Activate();}}}class KeyboardHookLib {//钩子类型:键盘private const int WH_KEYBOARD_LL = 13; //全局钩子键盘为13,线程钩子键盘为2private const int WM_KEYDOWN = 0x0100; //键按下private const int WM_KEYUP = 0x0101; //键弹起//全局系统按键private const int WM_SYSKEYDOWN = 0x104;//键盘处理委托事件,捕获键盘输入,调用委托方法private delegate int HookHandle(int nCode, int wParam, IntPtr lParam);private static HookHandle _keyBoardHookProcedure;//接收SetWindowsHookEx返回值   private static int _hHookValue = 0;//Hook结构 存储按键信息的结构体[StructLayout(LayoutKind.Sequential)]public class HookStruct {public int vkVode;public int scanCode;public int flags;public int time;public int dwExtraInfo;}//安装钩子//idHook为13代表键盘钩子为14代表鼠标钩子,lpfn为函数指针,指向需要执行的函数,hIntance为指向进程快的指针,threadId默认为0就可以了[DllImport("user32.dll")]private static extern int SetWindowsHookEx(int idHook, HookHandle lpfn, IntPtr hInstance, int threadId);//取消钩子[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern bool UnhookWindowsHookEx(int idHook);//调用下一个钩子[DllImport("user32.dll")]public static extern int CallNextHookEx(int idHook, int nCode, int wParam, IntPtr lParam);//获取当前线程id[DllImport("kernel32.dll")]public static extern int GetCurrentThreadId();//通过线程Id,获取进程快[DllImport("kernel32.dll")]public static extern IntPtr GetModuleHandle(String name);private IntPtr _hookWindowPtr = IntPtr.Zero;public KeyboardHookLib() { }public void InstallHook() {//安装键盘勾子if (_hHookValue == 0) {_keyBoardHookProcedure = new HookHandle(GetHookProc);//得到进程块_hookWindowPtr = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);_hHookValue = SetWindowsHookEx(WH_KEYBOARD_LL,_keyBoardHookProcedure,_hookWindowPtr,0);//如果设置钩子失败if (_hHookValue == 0) {UninstallHook();}}}//取消钩子事件public void UninstallHook() {if (_hHookValue != 0) {bool ret = UnhookWindowsHookEx(_hHookValue);if (ret) {_hHookValue = 0;}}}private static int GetHookProc(int nCode, int wParam, IntPtr lParam) {//当nCode大于0,并且时按下事件时为1if (nCode >= 0 && (wParam == WM_KEYDOWN) || (wParam == WM_KEYDOWN)) {//将按键信息转换为结构体HookStruct hookStruc = (HookStruct)Marshal.PtrToStructure(lParam, typeof(HookStruct));//是否拦截按键的标识符,默认不拦截bool handle = false;switch ((Keys)hookStruc.vkVode) {//将拦截标识符置为拦截,如果按了上键相当于向当前窗口发送一个回车//再发送greendisgood 10000,再发送一个回车case Keys.Up:handle = true;SendKeys.Send("{ENTER}");SendKeys.Send("greendisgood 1000");SendKeys.Send("{ENTER}");break;}//1表示拦截键盘if (handle){ return 1; }}return CallNextHookEx(_hHookValue, nCode, wParam, lParam);}}}

先运行程序,然后点击开启改键,然后缩小程序,然后随便打开一个可以输入文字的东西如文档等,我这里直接拿一个记事本做测试,文档一开始为空,然后按一下UP上键,内容如下:

有输入法的话,先把输入法关了,不然会乱码!

C#:键盘钩子的使用,实现键盘屏蔽 及 全局改键功能相关推荐

  1. 自己写一个键盘钩子程序来监视键盘输入

    "钩子是Windows的消息监视点,应用程序可以在这里安装一个监视子程序,这样就可以在系统中的消息流到达目的窗口过程前监控它们" 上面就是WIN32API手册中对钩子的描述.大概就 ...

  2. 使用全局鼠标键盘钩子,监控鼠标键盘事件

    文章目录 1.情况说明 2.windows下hook技术 3.钩子回调的参数分析 4.代码 1.情况说明 首先平台是windows平台 目的:监控鼠标的点击事件.鼠标的位置.键盘的点击事件 背景:在做 ...

  3. c语言模拟键盘自动按键,C语音键盘钩子和用法 模拟键盘

    #include void main() { /* 函数原型 VOID keybd_event( BYTE bVk, BYTE bScan, DWORD dwFlags, DWORD dwExtraI ...

  4. 基于键盘钩子的dota改键(单线程+DLL)MFC实现(源码+总结)

    呼..终于可以摒弃网上带广告的改键工具了.. 历经三天,写出自己的dota改键软件最简单版了. 还学习了两个新知识,钩子和动态链接库.下面以一个新手的角度,总结下这三天遇到的大小问题. 一般钩子在什么 ...

  5. 基于低级键盘钩子的dota改键(全局+免DLL注入)MFC实现(源码+总结)

    上一篇文章已经写了基于 普通键盘钩子(单线程+DLL)来实现dota改键.http://blog.csdn.net/a576323437/article/details/8037138 这一次,基于 ...

  6. C++编写Windows全局键盘钩子记录键盘输入

    1.键盘钩子处理程序 HookProc 2.键盘钩子安装程序 InstallHook 3.键盘钩子卸载程序 UnInstallHook 4.键盘钩子dll的加载,安装与释放 生成标准windows d ...

  7. 【Delphi】Windows系统下的键盘钩子

    目的:为了实现得力牌扫码枪的输入,并执行特定功能. 场景描述:此款扫码枪模拟键盘信号,并支持以回车.换行等结尾,这里采用回车结尾进行开发. 思路:使用Windows的钩子回调函数,这里模拟键盘信号所以 ...

  8. 利用底层键盘钩子屏蔽任意按键

    很多人都知道,如果想在系统范围内屏蔽键盘上的任意按键需要使用全局键盘钩子,然而像win键这样"倔强"的按键又不是普通的键盘钩子就能搞定的.这里我提供一种利用底层键盘钩子屏蔽任意按键 ...

  9. 利用底层键盘钩子拦载任意按键(回调版)

    前段时间我曾经写过一篇<利用底层键盘钩子屏蔽任意按键>,并放到了我的blog上.这篇文章的题目中把"屏蔽"改成了"拦截",显然要比以前的版本强一些了 ...

最新文章

  1. Unity 3D为策略游戏创建地图学习教程
  2. XSKY发布两款存储产品 以Ceph为核心
  3. sdn体系的三个平面_十张图看懂SDN与NFV的区别与联系?
  4. 解决WDCP3环境gbk网站编码程序乱码问题
  5. AddMvc 和 AddMvcCore 的区别
  6. pymysql建表_Python数据库操作,针对pymysql 和 MYSQL数据库
  7. 为List配置一个搜索按钮
  8. excel重复上一步快捷键_13个excel快捷键,让你的1秒钟,抵得上同事的5分钟
  9. 2017 ACM暑期多校联合训练 - Team 3 1008 HDU 6063 RXD and math (莫比乌斯函数)...
  10. 基于kafka的定时消息/任务服务
  11. 使用create-keyframe-animation实现js动画
  12. (双硬盘(SSD+HDD)/单硬盘)双系统win10+ubuntu18.04安装记录
  13. 方正台式计算机初始bios密码,方正电脑刷BIOS的方法
  14. Excel:INDEX函数与MATCH函数
  15. 新一代消息中间件—Apache Pulsar
  16. 【牛客练习赛13】 A B C D【康拓展开】 E【DP or 记忆化搜索】 F 【思维】
  17. linux 向日葵 使用方法,远程控制工具——Centos7上向日葵安装使用
  18. [阅读笔记]蘑菇书《Easy RL》
  19. “马”道微信:全面拆解微信营销模式
  20. 浅析缓冲区溢出漏洞的利用与Shellcode编写

热门文章

  1. 一次使用wxcharts做微信小程序图表功能采到的坑
  2. 使用 Python 和 Cheetah 构建和扩充模板
  3. locationManager.getLastKnownLocation(locationProvider);//地理位置获取为null的解决方案
  4. python具有什么特性_python是什么?python具有怎样的特性?
  5. 共享会话怎么设置没访问自动断开_云共享文档这种小事,何必专业NAS出手?蒲公英X1轻松搞定...
  6. 使用Socket进行设备间点对点连接传输数据
  7. Ubuntu服务器的安装和配置----系统安装
  8. 深入Java Servlets网络编程 西安电子科技大学出版社
  9. 英雄联盟怎么解除小窗口_英雄联盟手游ping信号怎么发 怎么给队友发信号_英雄联盟手游...
  10. 说说project2010中的颜色