新增类KeybordHookProc

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms; namespace HookDemo
{
/// <summary>
/// 这个类可以让你得到一个在运行中程序的所有键盘事件
/// 并且引发一个带KeyEventArgs和MouseEventArgs参数的.NET事件以便你很容易使用这些信息
/// </summary>
public class KeyBordHook
{ private const byte LLKHF_ALTDOWN = 0x20;
private const byte VK_CAPITAL = 0x14;
private const byte VK_ESCAPE = 0x1B;
private const byte VK_F4 = 0x73;
private const byte VK_LCONTROL = 0xA2;
private const byte VK_NUMLOCK = 0x90;
private const byte VK_RCONTROL = 0xA3;
private const byte VK_SHIFT = 0x10;
private const byte VK_TAB = 0x09;
public const int WH_KEYBOARD = ;
private const int WH_MOUSE = ;
private const int WH_MOUSE_LL = ;
private const int WM_KEYDOWN = 0x100;
private const int WM_KEYUP = 0x101;
private const int WM_LBUTTONDBLCLK = 0x203;
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_LBUTTONUP = 0x202;
private const int WM_MBUTTONDBLCLK = 0x209;
private const int WM_MBUTTONDOWN = 0x207;
private const int WM_MBUTTONUP = 0x208;
private const int WM_MOUSEMOVE = 0x200;
private const int WM_MOUSEWHEEL = 0x020A;
private const int WM_RBUTTONDBLCLK = 0x206;
private const int WM_RBUTTONDOWN = 0x204;
private const int WM_RBUTTONUP = 0x205;
private const int WM_SYSKEYDOWN = 0x104;
private const int WM_SYSKEYUP = 0x105; //全局的事件
public event KeyEventHandler OnKeyDownEvent;
public event KeyEventHandler OnKeyUpEvent;
public event KeyPressEventHandler OnKeyPressEvent; static int hKeyboardHook = ; //键盘钩子句柄 //鼠标常量
public const int WH_KEYBOARD_LL = ; //keyboard hook constant HookProc KeyboardHookProcedure; //声明键盘钩子事件类型. //声明键盘钩子的封送结构类型
[StructLayout(LayoutKind.Sequential)]
public class KeyboardHookStruct
{
public int vkCode; //表示一个在1到254间的虚似键盘码
public int scanCode; //表示硬件扫描码
public int flags;
public int time;
public int dwExtraInfo;
} //装置钩子的函数
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId); //卸下钩子的函数
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook); //下一个钩挂的函数
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam); //取得当前线程编号
[DllImport("kernel32.dll")]
private static extern int GetCurrentThreadId(); [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern short GetKeyState(int vKey); public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam); /// <summary>
/// 墨认的构造函数构造当前类的实例并自动的运行起来.
/// </summary>
public KeyBordHook()
{
Start();
} //析构函数.
~KeyBordHook()
{
Stop();
} /// <summary>
/// 启动Hook,并用流屏蔽任务管理器
/// </summary>
public void Start()
{
if (hKeyboardHook == )
{
// 创建HookProc实例
KeyboardHookProcedure = new HookProc(KeyboardHookProc); hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD,
KeyboardHookProcedure,
Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[]),
); // 如果设置钩子失败
if (hKeyboardHook == )
{
Stop();
AppLog.Error("SetWindowsHookEx failed.");
} ////用二进制流的方法打开任务管理器。而且不关闭流.这样任务管理器就打开不了
//MyFs = new FileStream(Environment.ExpandEnvironmentVariables("%windir%\\system32\\taskmgr.exe"),
// FileMode.Open);
//byte[] MyByte = new byte[(int)MyFs.Length];
//MyFs.Write(MyByte, 0, (int)MyFs.Length);
}
} /// <summary>
/// 卸载Hook
/// </summary>
public void Stop()
{
bool retKeyboard = true; if (hKeyboardHook != )
{
retKeyboard = UnhookWindowsHookEx(hKeyboardHook); hKeyboardHook = ;
} //if (null != MyFs)
//{
// MyFs.Close();
//} if (!(retKeyboard))
{
AppLog.Error("UnhookWindowsHookEx failed.");
}
} #region Nested type: KeyMSG public struct KeyMSG
{
public int dwExtraInfo;
public int flags;
public int scanCode; public int time;
public int vkCode;
} #endregion /// <summary>
/// 键盘钩子
/// </summary>
/// <param name="nCode"></param>
/// <param name="wParam"></param>
/// <param name="lParam"></param>
/// <returns></returns>
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
KeyboardHookStruct m = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct)); AppLog.Debug($"nCode is :{nCode} -- vkCode is :{m.vkCode}");
if (m.vkCode == (int)Keys.LWin ||
m.vkCode == (int)Keys.RWin ||
m.vkCode == (int)Keys.LWin && m.vkCode == (int)Keys.D ||
m.vkCode == (int)Keys.RWin && m.vkCode == (int)Keys.D ||
m.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control ||
m.vkCode == (int)Keys.F4 && (int)Control.ModifierKeys == (int)Keys.Alt ||
m.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Alt ||
m.vkCode == (int)Keys.Tab && (int)Control.ModifierKeys == (int)Keys.Alt ||
m.vkCode == (int)Keys.Escape && (int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Shift ||
(int)Control.ModifierKeys == (int)Keys.Control + (int)Keys.Alt + (int)Keys.Delete
)
{
AppLog.Info("hooc is OK");
return ;
} return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
} }
}

添加键盘按键触发事件

/// <summary>
/// 键盘按下触发事件
/// </summary>
void kh_OnKeyDownEvent(object sender, KeyEventArgs e)
{ }

键盘钩子的使用


/// <summary>
/// 键盘钩子
/// </summary>
KeyBordHook _keyBordHook;

//键盘钩子实例化
_keyBordHook = new KeyBordHook();
_keyBordHook.OnKeyDownEvent += kh_OnKeyDownEvent;

winform使用钩子限制windows热键的更多相关文章

  1. Winform开发框架之通用Windows摄像头调用拍照--SNF快速开发平台3.3-Spring.Net.Framework

    今天做了一个windows系统下调用摄像头.进行开启.关闭.拍照.设置等等功能演示. 进行源码贡献,欢迎大家下载使用 一.DEMO效果如下: 二.DEMO演示代码如下: using SNF.Utili ...

  2. 推荐一款轻量小众却高效免费开源windows热键脚本语言Autohotkey

    写在前面的话 Autohotkey是一款轻量小众但高效免费开源的windows热键脚本语言,游戏操纵.鼠标操作.键盘快捷重定义,快捷短语等等,只有你想不到,没有它做不到,神器中的神器呀,相见恨晚. 安 ...

  3. WinForm和WPF中注册热键

    由于.Net没有提供专门的类库处理热键,所以需要直接调用windows API来解决. HotKey为.NET调用Windows API的封装代码,主要是RegisterHotKey和Unregist ...

  4. C# 注册 Windows 热键

    闲扯: 前几日,一个朋友问我如何实现按 F1 键实现粘贴(Ctrl+V)功能,百度了一个方法,发给他,他看不懂(已经是 Boss 的曾经的码农),我就做了个Demo给他参考.今日得空,将 Demo 整 ...

  5. [Winform]通过钩子监控键盘操作和鼠标移动

    摘要 有这样一个需求,在程序隐藏之后,需要监控当前电脑是否有操作,如果1分钟内,无操作,则弹出视频,循环播放. 解决办法 从网上找的一个解决办法,可以通过钩子的方式实现,这里记录一下. /// < ...

  6. Windows热键注册的底层原理

    要像系统注册一个全局热键,需要用到RegisterHotKey,函数用法如下(MSDN):BOOL RegisterHotKey(                                    ...

  7. winform窗体之间通过 windows API SendMessage函数传值

    -----------------------------------------------------------‘接收窗体’代码.cs------------------------------ ...

  8. winform播放视频(windows media player)

    1.找到windows media player 工具箱常规下边右键,右键弹窗点击“选择项”,选择工具箱窗口点击“COM组件”,找到 Windows Media Player 勾选,点击确定 2.使用 ...

  9. winform textbox 不能唤醒windows 平板的软键盘解决办法

    这个问题,研究了将近两个小时,baidu,google,好大一会,windows 平板本身的应用程序,必须浏览器,notepad都是可以自动唤起软键盘的,但是我的winfrom 程序就是不可以,起先怀 ...

随机推荐

  1. Android Studio相关

    1.下载安装 Android Studio 2.打开已有或是新建工程,gradle编译时候会报错(被墙),可以切换阿里的源 修改build.gradle 的配置: buildscript { repo ...

  2. iPad适配tabBarController

    iPad的tabBarController会在底部居中显示,根据不同的需求可能需要把tabBarItem均匀分布显示,具体修改如下 self.tabBar.itemPositioning = UITa ...

  3. Quartus设计FIR滤波器的系数文件格式(适用于FIR II的IP核)

    对常用的FIR,我们使用MATLAB的fdatool(或者filterDesigner) 设计滤波器,给定指标,生成系数.为了方便,我们将系数保存到文件,其保存格式比较简介,在此进行说明. 1.FIR ...

  4. printf的封装与实现

    1 UART通信协议 1.1 UART通信的物理连接 图1 UART的物理连接 1.2 逻辑电平 用电平表示逻辑1和逻辑0,逻辑1和逻辑0用来组织计算机层面的数据. 1.3 电平标准 根据通讯使用的电 ...

  5. S7-300数据处理基本知识(结尾以MW8+1 ADD指令实训仿真,并用状态表监控及刷写变量)

    数据处理基本知识汇总 STEP7 的数据类型包括什么? 基本数据类型 复杂数据类型 用于FB(功能块)的输入,输出参数类型 用于FC(功能)的输入,输出参数类型 基本数据类型是什么? 先列举12种数据 ...

  6. 51nod 1437:迈克步 单调栈基础题

    1437 迈克步 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题  收藏  取消关注 有n只熊.他们站成一排队伍,从左到右依次1到 ...

  7. 《新标准C++程序设计》4.1(C++学习笔记12)

    运算符重载的概念和原理 一.运算符重载的需求 C++预定义的“+.-. * ./.%. ^ .&.~.!.|. = .<< >>.!= ”等运算符,只能用于基本数据类型 ...

  8. HttpServletRequest HttpServletResponse接口详解

    HttpServletRequest接口最常用的方法就是获得请求中的参数,这些参数一般是客户端表单中的数据.同时,HttpServletRequest接口可以获取由客户端传送的名称,也可以获取产生请求 ...

  9. opencv.js双边滤波 磨皮处理

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http ...

  10. Java中的package和Import关键字的作用

    一.package关键的作用 1.包的概念 package翻译为包,本质上就是一个文件夹,通过包组织项目结构的过程,就是通过包对应的文件夹管理.java和.class文件的过程. 2.包的作用 通过包 ...