当前位置:  编程技术>.net/c#/asp.net

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

    来源: 互联网  发布时间:2014-10-31

    本文导语:  本文所述为基于C#实现的HOOK实例,该实例可用来屏蔽系统热键。程序主要实现了安装钩子、传递钩子、卸载钩子等功能。在传递钩子中: 是您自己的钩子函数的句柄。用该句柄可以遍历钩子链 把传入的参数简单传给CallNextHookEx...

本文所述为基于C#实现的HOOK实例,该实例可用来屏蔽系统热键。程序主要实现了安装钩子、传递钩子、卸载钩子等功能。在传递钩子中:
是您自己的钩子函数的句柄。用该句柄可以遍历钩子链
把传入的参数简单传给CallNextHookEx即可
把传入的参数简单传给CallNextHookEx即可,
在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);
    /// 传递钩子
      /// 是您自己的钩子函数的句柄。用该句柄可以遍历钩子链
    /// 把传入的参数简单传给CallNextHookEx即可
    /// 把传入的参数简单传给CallNextHookEx即可
    /// 
    /// 
    [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 方法
    /// 
    /// 钩子捕获消息后,对消息进行处理
    /// 
    /// 标识,键盘是否操作 
    /// 键盘的操作值
    /// 指针
    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 安装、卸载钩子
    /// 
    /// 安装钩子
    /// 
    /// 是否安装成功
    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;
    }
    /// 
    /// 卸载钩子
    /// 
    /// 是否卸载成功
    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 公共方法
  }
}

    
 
 

您可能感兴趣的文章:

  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • C#实现获取枚举中元素个数的方法
  • C#实现自定义双击事件
  • C#键盘输入回车键实现点击按钮效果的方法
  • C#实现获取一年中是第几个星期的方法
  • 实现DataGridView控件中CheckBox列的使用实例 iis7站长之家
  • C#实现装箱与拆箱操作简单实例
  • 解决C#中WebBrowser的DocumentCompleted事件不执行的实现方法
  • C#下实现创建和删除目录的实例代码
  • 使用C#实现在屏幕上画图效果的代码实例
  • C#实现过滤html标签并保留a标签的方法
  • c#实现TextBox只允许输入数字
  • C# Winform 整个窗口拖动的实现代码
  • c# ListView实现双击Item事件的变通方法
  • C#实现随鼠标移动窗体实例
  • C#中的FileUpload 选择后的预览效果具体实现
  • C# 窗体隐藏及任务管理器中禁止关闭的实现代码
  • C#的锯齿数组以及C++实现代码
  • C#格式化文件大小的实现代码
  • C#怎样才能实现窗体最小化到托盘呢?
  • C# char类型字符转换大小写的实现代码
  • Solaris系统下函数钩子如何实现!急急急。。。!!
  • c# 全局鼠标钩子的实现代码
  • c# 系统钩子的实现代码
  • c# 键盘钩子的实现代码
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问在一个servlet里取得一个用singleton模式实现的类实例,那么这个类实例的生命周期是怎样的?
  • 高分求c 实现线程池的一个实例
  • python实现的重启关机程序实例
  • 怎样检测一个对象的实例的存在,并且删除它?程序是怎样实现的?谢谢!
  • python调用短信猫控件实现发短信功能实例
  • Java调用DOS实现定时关机的实例
  • C语言实现杨辉三角实例
  • 那位牛人可以说说实例池的原理和实现??
  • C语言实现堆排序的简单实例
  • java实现大数加法(BigDecimal)的实例代码
  • 实现DataGridView控件中CheckBox列的使用实例
  • ThinkPHP实现批量删除数据的代码实例
  • jQuery实现回车键(Enter)切换文本框焦点的代码实例
  • jquery实现弹出div,始终显示在屏幕正中间的简单实例
  • ******"Servlet根据JSP视图的需求生成JavaBeans的实例并输出给JSP环境"如何实现上面这句话的效果??*******
  • VC++简单实现关机、重启计算机实例代码
  • haskell实现多线程服务器实例代码
  • Java通过接口实现匿名类的实例代码
  • wince程序防止创建多个实例实现互斥作用
  • Python实现冒泡,插入,选择排序简单实例
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • socket实现多文件并发传输,求助多线程实现问题?
  • Python GUI编程:tkinter实现一个窗口并居中代码
  • interface 到底有什么用???实现接口,怎么实现??
  • 通过javascript库JQuery实现页面跳转功能代码
  • 怎么用Jsp实现在页面实现树型结构?
  • sharepoint 2010 使用STSNavigate函数实现文件下载举例
  • windows 下的PortTunnel 在linux下怎么实现?或者相应的已经实现的软件?端口映射
  • php实现socket实现客户端和服务端数据通信源代码
  • 网站重定向用C语言实现iptables,ACL实现
  • flash AS3反射实现(describeType和getDefinitionByName)


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3