• 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#使用钩子获得按键信息的方法

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

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

本文实例讲述了C#使用钩子获得按键信息的方法。分享给大家供大家参考。具体如下:

窗体相关代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.Threading;
using ReadBadCode;
namespace gouzi
{
 public partial class Form2 : Form
 {
  BarCodeHook BarCode = new BarCodeHook();
  public Form2()
  {
   InitializeComponent();
   BarCode.BarCodeEvent += new BarCodeHook.BarCodeDelegate(BarCode_BarCodeEvent);
  }
  private delegate void ShowInfoDelegate(BarCodeHook.BarCodes barCode);
  private void ShowInfo(BarCodeHook.BarCodes barCode)
  {
   if (this.InvokeRequired)
   {
    this.BeginInvoke(new ShowInfoDelegate(ShowInfo), new object[] { barCode });
   }
   else
   {
    textBox1.Text = barCode.KeyName;//键名
    textBox2.Text = barCode.VirtKey.ToString();//虚拟码
    textBox3.Text = barCode.ScanCode.ToString();//扫描码
    textBox4.Text = barCode.AscII.ToString();//AscII
    textBox5.Text = barCode.Chr.ToString();//字符
    textBox6.Text = barCode.IsValid ? barCode.BarCode : "";
    //在这里进行键入值
   }
  }
  void BarCode_BarCodeEvent(BarCodeHook.BarCodes barCode)
  {
   ShowInfo(barCode);
  }
  private void Form2_Load(object sender, EventArgs e)
  {
   BarCode.Start();
  }
  private void Form2_StyleChanged(object sender, EventArgs e)
  {
   BarCode.Stop();
  }
 }
}
</div>

后台类代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Reflection;
namespace ReadBadCode
{
 class BarCodeHook
 {
  public delegate void BarCodeDelegate(BarCodes barCode);
  public event BarCodeDelegate BarCodeEvent;
  public struct BarCodes
  {
   public int VirtKey;  //虚拟码 
   public int ScanCode;  //扫描码 
   public string KeyName; //键名 
   public uint AscII;  //AscII 
   public char Chr;   //字符
   public string BarCode; //条码信息 
   public bool IsValid;  //条码是否有效 
   public DateTime Time; //扫描时间 
  }
  private struct EventMsg
  {
   public int message;
   public int paramL;
   public int paramH;
   public int Time;
   public int hwnd;
  }
  // 安装钩子 
  [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
  private static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
  // 卸载钩子
  [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
  private static extern bool UnhookWindowsHookEx(int idHook);
  // 继续下一个钩子
  [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
  private static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
  //获取键名的字符串
  [DllImport("user32", EntryPoint = "GetKeyNameText")]
  private static extern int GetKeyNameText(int lParam, StringBuilder lpBuffer, int nSize);
  //将256个虚拟键复制到指定的缓冲区中
  [DllImport("user32", EntryPoint = "GetKeyboardState")]
  private static extern int GetKeyboardState(byte[] pbKeyState);
  //将指定的虚拟键码和键盘状态为相应的字符串
  [DllImport("user32", EntryPoint = "ToAscii")]
  private static extern bool ToAscii(int VirtualKey, int ScanCode, byte[] lpKeyState, ref uint lpChar, int uFlags);
  //声明定义回调函数
  delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
  BarCodes barCode = new BarCodes();
  int hKeyboardHook = 0;
  string strBarCode = "";
  private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
  {
   if (nCode == 0)
   {
    EventMsg msg = (EventMsg)Marshal.PtrToStructure(lParam, typeof(EventMsg));
    if (wParam == 0x100) //WM_KEYDOWN = 0x100
    {
     barCode.VirtKey = msg.message & 0xff; //虚拟码 
     barCode.ScanCode = msg.paramL & 0xff; //扫描码
     StringBuilder strKeyName = new StringBuilder(255);
     if (GetKeyNameText(barCode.ScanCode * 65536, strKeyName, 255) > 0)
     {
      barCode.KeyName = strKeyName.ToString().Trim(new char[] { ' ', '\0' });
     }
     else
     {
      barCode.KeyName = "";
     }
     byte[] kbArray = new byte[256];
     uint uKey = 0;
     GetKeyboardState(kbArray);
     if (ToAscii(barCode.VirtKey, barCode.ScanCode, kbArray, ref uKey, 0))
     {
      barCode.AscII = uKey;
      barCode.Chr = Convert.ToChar(uKey);
     }
     if (DateTime.Now.Subtract(barCode.Time).TotalMilliseconds > 50)
     {
      strBarCode = barCode.Chr.ToString();
     }
     else
     {
      if ((msg.message & 0xff) == 13 && strBarCode.Length > 3)
      //回车
      {
       barCode.BarCode = strBarCode;
       barCode.IsValid = true;
      }
      strBarCode += barCode.Chr.ToString();
     }
     barCode.Time = DateTime.Now;
     if (BarCodeEvent != null) BarCodeEvent(barCode);
     //触发事件 
     barCode.IsValid = false;
    }
   }
   return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);
  }
  // 安装钩子 
  public bool Start()
  {
   if (hKeyboardHook == 0)
   {
    //WH_KEYBOARD_LL = 13 
    hKeyboardHook = SetWindowsHookEx(13, new HookProc(KeyboardHookProc), Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
   }
   return (hKeyboardHook != 0);
  }
  // 卸载钩子 
  public bool Stop()
  {
   if (hKeyboardHook != 0)
   {
    return UnhookWindowsHookEx(hKeyboardHook);
   }
   return true;
  }
 }
}
</div>

【注意】要想测试实际的效果,必须执行编译后的Exe文件,在开发环境直接运行会没有效果的。

希望本文所述对大家的C#程序设计有所帮助。

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

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

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

相关文章

  • 2017-05-28DevExpress实现GridControl根据列选中一行
  • 2017-05-28C#难点逐个击破(1):ref参数传递
  • 2017-05-28c#使用正则表达式匹配字符串验证URL示例
  • 2017-05-28举例讲解C#编程中对设计模式中的单例模式的运用
  • 2017-05-28C#计算字符串哈希值(MD5、SHA)的方法小结
  • 2017-05-28C#遍历操作系统下所有驱动器的方法
  • 2017-05-28解析Silverlight调用WCF/Rest异常的解决方法
  • 2017-05-28C#移除所有事件绑定的方法
  • 2017-05-28C#执行DOS命令的方法
  • 2017-05-28C#处理datagridview虚拟模式的方法

文章分类

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

最近更新的内容

    • C#通过域名获得IP地址的方法
    • C#和Java中二维数组区别分析
    • C#开发教程之ftp操作方法整理
    • 程序中两个Double类型相加出现误差的解决办法
    • 轻松学习C#的结构和类
    • c#的treeview绑定和获取值的方法
    • C#中的集合用法分析
    • C#观察者模式(Observer Pattern)实例教程
    • 浅谈C#网络编程详解篇
    • OpenXml读写Excel实例代码

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

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