• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 基于C#实现的HOOK键盘钩子实例代码

基于C#实现的HOOK键盘钩子实例代码

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了hook钩子,c#hook,c#键盘钩子,c#钩子程序,c#钩子等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

本文所述为基于C#实现的HOOK实例,该实例可用来屏蔽系统热键。程序主要实现了安装钩子、传递钩子、卸载钩子等功能。在传递钩子中:
<param name="pHookHandle">是您自己的钩子函数的句柄。用该句柄可以遍历钩子链</param>
<param name="nCode">把传入的参数简单传给CallNextHookEx即可</param>
<param name="wParam">把传入的参数简单传给CallNextHookEx即可</param>,
在HOOK类中定义了一些私有变量:键盘钩子句柄、键盘钩子委托实例、底层的钩子变量等。在钩子捕获消息后,对消息进行处理。

具体实现HOOK代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Reflection;
using System.IO;
namespace 设置和屏蔽系统热键
{
  class HOOK
  {
    #region 私有变量
 private IntPtr m_pKeyboardHook = IntPtr.Zero;/// 键盘钩子句柄
 public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);/// 钩子委托声明
 private HookProc m_KeyboardHookProcedure;/// 键盘钩子委托实例
  public const int idHook = 13;/// 底层的钩子变量
  [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
  public static extern IntPtr SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr pInstance, int threadId);/// 安装钩子
  [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]/// 卸载钩子
  public static extern bool UnhookWindowsHookEx(IntPtr pHookHandle);
    /// 传递钩子
      /// <param name="pHookHandle">是您自己的钩子函数的句柄。用该句柄可以遍历钩子链</param>
    /// <param name="nCode">把传入的参数简单传给CallNextHookEx即可</param>
    /// <param name="wParam">把传入的参数简单传给CallNextHookEx即可</param>
    /// <param name="lParam"></param>
    /// <returns></returns>
    [DllImport("user32.dll", CallingConvention = CallingConvention.StdCall)]
    public static extern int CallNextHookEx(IntPtr pHookHandle, int nCode, Int32 wParam, IntPtr lParam);
    [StructLayout(LayoutKind.Sequential)]
    public struct KeyMSG
    {
      public int vkCode;
      public int scanCode;
      public int flags;
      public int time;
      public int dwExtraInfo;
    }
    protected const int WM_QUERYENDSESSION = 0x0011;
    protected const int WM_KEYDOWN = 0x100;
    protected const int WM_KEYUP = 0x101;
    protected const int WM_SYSKEYDOWN = 0x104;
    protected const int WM_SYSKEYUP = 0x105;
    protected const byte VK_SHIFT = 0x10;
    protected const byte VK_CAPITAL = 0x14;
    protected const byte VK_NUMLOCK = 0x90;
    protected const byte VK_LSHIFT = 0xA0;
    protected const byte VK_RSHIFT = 0xA1;
    protected const int VK_LWIN = 91;
    protected const int VK_RWIN = 92;
    protected const byte VK_LCONTROL = 0xA2;
    protected const byte VK_RCONTROL = 0x3;
    protected const byte VK_LALT = 0xA4;
    protected const byte VK_RALT = 0xA5;
    protected const byte LLKHF_ALTDOWN = 0x20;
    public bool Porwer = true;//是否屏蔽Porwer键
    public static int pp = 0;//热键的返回值
    public static bool isSet = false;//是否设置屏蔽热键,false为设置屏蔽的热键
    public static bool isHotkey = false;
    public static bool isInstall = false;//是否安装钩子,true为安装
    #endregion
    #region 事件的声明
    public event KeyEventHandler KeyDown;//键盘按下事件
    public event KeyEventHandler KeyUp;//键盘松开事件
    public event KeyPressEventHandler KeyPress;//键盘单击事件
    #endregion
    #region 方法
    /// <summary>
    /// 钩子捕获消息后,对消息进行处理
    /// </summary>
    /// <param nCode="int">标识,键盘是否操作</param> 
    /// <param wParam="int">键盘的操作值</param>
    /// <param lParam="IntPtr">指针</param>
    private int KeyboardHookProc(int nCode, int wParam, IntPtr lParam)
    {
      if (nCode > -1 && (KeyDown != null || KeyUp != null || KeyPress != null))
      {
        KeyMSG keyboardHookStruct = (KeyMSG)Marshal.PtrToStructure(lParam, typeof(KeyMSG));//获取钩子的相关信息
        KeyEventArgs e = new KeyEventArgs((Keys)(keyboardHookStruct.vkCode));//获取KeyEventArgs事件的相磁信息
        switch (wParam)
        {
          case WM_KEYDOWN://键盘按下操作
          case WM_SYSKEYDOWN:
            if (KeyDown != null)//如果加载了当前事件
            {
              KeyDown(this, e);//调用该事件
            }
            break;
          case WM_KEYUP://键盘松开操作
          case WM_SYSKEYUP:
            if (KeyUp != null)//如果加载了当前事件
            {
              KeyUp(this, e);//调用该事件
            }
            break;
        }
      }
      return pp;//是否屏蔽当前热键,1为屏蔽,2为执行
    }
    #endregion
    #region 安装、卸载钩子
    /// <summary>
    /// 安装钩子
    /// </summary>
    /// <returns>是否安装成功</returns>
    public bool Start()
    {
      IntPtr pInstance = (IntPtr)4194304;//钩子所在实例的句柄
      if (this.m_pKeyboardHook == IntPtr.Zero)//如果键盘的句柄为空
      {
        this.m_KeyboardHookProcedure = new HookProc(KeyboardHookProc);//声明一个托管钩子
        this.m_pKeyboardHook = SetWindowsHookEx(idHook, m_KeyboardHookProcedure, pInstance, 0);//安装钩子
        if (this.m_pKeyboardHook == IntPtr.Zero)//如果安装失败
        {
          this.Stop();//卸载钩子
          return false;
        }
      }
      isInstall = true;//安装了钩子
      return true;
    }
    /// <summary>
    /// 卸载钩子
    /// </summary>
    /// <returns>是否卸载成功</returns>
    public bool Stop()
    {
      if (isInstall == false)//如果没有安装钩子
      {
        return true;
      }
      bool result = true;
      if (this.m_pKeyboardHook != IntPtr.Zero)//如果安装了钩子
      {
        result = (UnhookWindowsHookEx(this.m_pKeyboardHook) && result);//卸载钩子
        this.m_pKeyboardHook = IntPtr.Zero;//清空键盘的钩子句柄
      }
      return result;
    }
    #endregion 公共方法
  }
}
</div> </div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 基于C#实现的HOOK键盘钩子实例代码
  • C# Hook钩子实例代码 截取键盘输入
  • 深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解

相关文章

  • 2017-05-28C#中缓存的基本用法总结
  • 2017-05-28c#详解datetime使用示例
  • 2017-05-28c#读写excel文件使用示例
  • 2017-05-28采用easyui tree编写简单角色权限代码的方法
  • 2017-05-28c#生成excel示例sql数据库导出excel
  • 2017-05-28C#数组初始化简析
  • 2017-05-28winform拦截关闭按钮触发的事件示例
  • 2017-05-28c# 以类名为参创建父类相同的类的实例代码
  • 2017-05-28c#分页显示服务器上指定目录下的所有图片示例
  • 2017-05-28解析C#设计模式编程中外观模式Facade Pattern的应用

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#类概念介绍
    • C#使用Shader实现夜幕降临倒计时的效果
    • C#中将ListView中数据导出到Excel的实例方法
    • 浅析C#中的Main(String[] args)参数输入问题
    • C#使用委托的步骤浅析
    • C#中struct和class的区别详解
    • 登录验证全局控制的几种方式总结(session)
    • C#位移的介绍与例子
    • C#程序打成 一键安装包-InstallShield教程
    • C# Automapper使用例子

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有