• 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#实现可捕获几乎所有键盘鼠标事件的钩子类完整实例

C#实现可捕获几乎所有键盘鼠标事件的钩子类完整实例

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

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

本文实例讲述了C#实现可捕获几乎所有键盘鼠标事件的钩子类。分享给大家供大家参考,具体如下:

using System;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
using System.Windows.Forms;
namespace MouseKeyboardLibrary
{
  /// <summary>
  /// Abstract base class for Mouse and Keyboard hooks
  /// </summary>
  public abstract class GlobalHook
  {
    #region Windows API Code
    [StructLayout(LayoutKind.Sequential)]
    protected class POINT
    {
      public int x;
      public int y;
    }
    [StructLayout(LayoutKind.Sequential)]
    protected class MouseHookStruct
    {
      public POINT pt;
      public int hwnd;
      public int wHitTestCode;
      public int dwExtraInfo;
    }
    [StructLayout(LayoutKind.Sequential)]
    protected class MouseLLHookStruct
    {
      public POINT pt;
      public int mouseData;
      public int flags;
      public int time;
      public int dwExtraInfo;
    }
    [StructLayout(LayoutKind.Sequential)]
    protected class KeyboardHookStruct
    {
      public int vkCode;
      public int scanCode;
      public int flags;
      public int time;
      public int dwExtraInfo;
    }
    [DllImport("user32.dll", CharSet = CharSet.Auto,
      CallingConvention = CallingConvention.StdCall, SetLastError = true)]
    protected static extern int SetWindowsHookEx(
      int idHook,
      HookProc lpfn,
      IntPtr hMod,
      int dwThreadId);
    [DllImport("user32.dll", CharSet = CharSet.Auto,
      CallingConvention = CallingConvention.StdCall, SetLastError = true)]
    protected static extern int UnhookWindowsHookEx(int idHook);
    [DllImport("user32.dll", CharSet = CharSet.Auto,
       CallingConvention = CallingConvention.StdCall)]
    protected static extern int CallNextHookEx(
      int idHook,
      int nCode,
      int wParam,
      IntPtr lParam);
    [DllImport("user32")]
    protected static extern int ToAscii(
      int uVirtKey,
      int uScanCode,
      byte[] lpbKeyState,
      byte[] lpwTransKey,
      int fuState);
    [DllImport("user32")]
    protected static extern int GetKeyboardState(byte[] pbKeyState);
    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    protected static extern short GetKeyState(int vKey);
    protected delegate int HookProc(int nCode, int wParam, IntPtr lParam);
    protected const int WH_MOUSE_LL = 14;
    protected const int WH_KEYBOARD_LL = 13;
    protected const int WH_MOUSE = 7;
    protected const int WH_KEYBOARD = 2;
    protected const int WM_MOUSEMOVE = 0x200;
    protected const int WM_LBUTTONDOWN = 0x201;
    protected const int WM_RBUTTONDOWN = 0x204;
    protected const int WM_MBUTTONDOWN = 0x207;
    protected const int WM_LBUTTONUP = 0x202;
    protected const int WM_RBUTTONUP = 0x205;
    protected const int WM_MBUTTONUP = 0x208;
    protected const int WM_LBUTTONDBLCLK = 0x203;
    protected const int WM_RBUTTONDBLCLK = 0x206;
    protected const int WM_MBUTTONDBLCLK = 0x209;
    protected const int WM_MOUSEWHEEL = 0x020A;
    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 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;
    #endregion
    #region Private Variables
    protected int _hookType;
    protected int _handleToHook;
    protected bool _isStarted;
    protected HookProc _hookCallback;
    #endregion
    #region Properties
    public bool IsStarted
    {
      get
      {
        return _isStarted;
      }
    }
    #endregion
    #region Constructor
    public GlobalHook()
    {
      Application.ApplicationExit += new EventHandler(Application_ApplicationExit);
    }
    #endregion
    #region Methods
    public void Start()
    {
      if (!_isStarted &&
        _hookType != 0)
      {
        // Make sure we keep a reference to this delegate!
        // If not, GC randomly collects it, and a NullReference exception is thrown
        _hookCallback = new HookProc(HookCallbackProcedure);
        _handleToHook = SetWindowsHookEx(
          _hookType,
          _hookCallback,
          //Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),
          0);
          IntPtr.Zero;
        // Were we able to sucessfully start hook?
        if (_handleToHook != 0)
        {
          _isStarted = true;
        }
      }
    }
    public void Stop()
    {
      if (_isStarted)
      {
        UnhookWindowsHookEx(_handleToHook);
        _isStarted = false;
      }
    }
    protected virtual int HookCallbackProcedure(int nCode, Int32 wParam, IntPtr lParam)
    {
      // This method must be overriden by each extending hook
      return 0;
    }
    protected void Application_ApplicationExit(object sender, EventArgs e)
    {
      if (_isStarted)
      {
        Stop();
      }
    }
    #endregion
  }
}

</div>
using System;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace MouseKeyboardLibrary
{
  /// <summary>
  /// Captures global keyboard events
  /// </summary>
  public class KeyboardHook : GlobalHook
  {
    #region Events
    public event KeyEventHandler KeyDown;
    public event KeyEventHandler KeyUp;
    public event KeyPressEventHandler KeyPress;
    #endregion
    #region Constructor
    public KeyboardHook()
    {
      _hookType = WH_KEYBOARD_LL;
    }
    #endregion
    #region Methods
    protected override int HookCallbackProcedure(int nCode, int wParam, IntPtr lParam)
    {
      bool handled = false;
      if (nCode > -1 && (KeyDown != null || KeyUp != null || KeyPress != null))
      {
        KeyboardHookStruct keyboardHookStruct =
          (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
        // Is Control being held down?
        bool control = ((GetKeyState(VK_LCONTROL) & 0x80) != 0) ||
                ((GetKeyState(VK_RCONTROL) & 0x80) != 0);
        // Is Shift being held down?
        bool shift = ((GetKeyState(VK_LSHIFT) & 0x80) != 0) ||
               ((GetKeyState(VK_RSHIFT) & 0x80) != 0);
        // Is Alt being held down?
        bool alt = ((GetKeyState(VK_LALT) & 0x80) != 0) ||
              ((GetKeyState(VK_RALT) & 0x80) != 0);
        // Is CapsLock on?
        bool capslock = (GetKeyState(VK_CAPITAL) != 0);
        // Create event using keycode and control/shift/alt values found above
        KeyEventArgs e = new KeyEventArgs(
          (Keys)(
            keyboardHookStruct.vkCode |
            (control ? (int)Keys.Control : 0) |
            (shift ? (int)Keys.Shift : 0) |
            (alt ? (int)Keys.Alt : 0)
            ));
        // Handle KeyDown and KeyUp events
        switch (wParam)
        {
          case WM_KEYDOWN:
          case WM_SYSKEYDOWN:
            if (KeyDown != null)
            {
              KeyDown(this, e);
              handled = handled || e.Handled;
            }
            break;
          case WM_KEYUP:
          case WM_SYSKEYUP:
            if (KeyUp != null)
            {
              KeyUp(this, e);
              handled = handled || e.Handled;
            }
            break;




 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

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

  • C#实现可捕获几乎所有键盘鼠标事件的钩子类完整实例
  • C#使用钩子获得按键信息的方法
  • C#实现的鼠标钩子
  • C#键盘鼠标钩子实例
  • 基于C#实现的HOOK键盘钩子实例代码
  • C# Hook钩子实例代码 截取键盘输入
  • 深入分析C#键盘勾子(Hook)拦截器,屏蔽键盘活动的详解

相关文章

  • 2017-05-28C#计算两个时间差的方法代码分享
  • 2017-05-28在.NET中读取嵌入和使用资源文件的方法
  • 2017-05-28Winform实现调用asp.net数据接口实例
  • 2017-05-28C# zxing二维码写入的实例代码
  • 2017-05-28深入c# Func委托的详解
  • 2017-05-28C#实现远程关闭计算机或重启计算机的方法
  • 2017-05-28C# 设计模式系列教程-模板方法模式
  • 2017-05-28C#利用原图和水印图的重叠简单实现水印的方法
  • 2017-05-28c#创建浮动工具栏功能示例
  • 2017-05-28C#中调用Servlet示例

文章分类

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

最近更新的内容

    • c# socket网络编程接收发送数据示例代码
    • C#选择排序法实例分析
    • C#设计模式之观察者模式实例讲解
    • c# 泛型类型参数与约束的深入分析
    • C#隐藏手机号、邮箱等敏感信息的实现方法
    • 基于c# 类、接口、结构的联系与区别详解
    • C#冒泡法排序算法实例分析
    • C#中使用JSON.NET实现JSON、XML相互转换
    • C#保存与读取DataTable信息到XML格式的方法
    • C#中dotnetcharting的用法实例详解

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

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