欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#使用鉤子獲得按鍵信息的方法

 更新時間:2015年05月14日 10:32:13   作者:兩把刷子  
這篇文章主要介紹了C#使用鉤子獲得按鍵信息的方法,實例分析了C#中鉤子的相關使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下

本文實例講述了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();
  }
 }
}

后臺類代碼:

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);
  // 繼續(xù)下一個鉤子
  [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個虛擬鍵復制到指定的緩沖區(qū)中
  [DllImport("user32", EntryPoint = "GetKeyboardState")]
  private static extern int GetKeyboardState(byte[] pbKeyState);
  //將指定的虛擬鍵碼和鍵盤狀態(tài)為相應的字符串
  [DllImport("user32", EntryPoint = "ToAscii")]
  private static extern bool ToAscii(int VirtualKey, int ScanCode, byte[] lpKeyState, ref uint lpChar, int uFlags);
  //聲明定義回調函數(shù)
  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);
     //觸發(fā)事件 
     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;
  }
 }
}

【注意】要想測試實際的效果,必須執(zhí)行編譯后的Exe文件,在開發(fā)環(huán)境直接運行會沒有效果的。

希望本文所述對大家的C#程序設計有所幫助。

相關文章

  • C#向Word文檔中添加內容控件的方法示例

    C#向Word文檔中添加內容控件的方法示例

    這篇文章主要給大家介紹了C#向Word文檔中添加內容控件的方法,文中對各種不同控件的添加方法分別進行了介紹,如組合框、文本、圖片、日期選取器及下拉列表等內容控件,都給出了詳細的示例代碼,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • C# 根據(jù)字符串生成二維碼的實例代碼

    C# 根據(jù)字符串生成二維碼的實例代碼

    這篇文章主要介紹了C# 根據(jù)字符串生成二維碼的實例,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • C#控制Excel Sheet使其自適應頁寬與列寬的方法

    C#控制Excel Sheet使其自適應頁寬與列寬的方法

    這篇文章主要介紹了C#控制Excel Sheet使其自適應頁寬與列寬的方法,涉及C#操作Excel的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2016-06-06
  • C#微信公眾號開發(fā)之用戶管理

    C#微信公眾號開發(fā)之用戶管理

    這篇文章介紹了C#微信公眾號開發(fā)之用戶管理,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C#操作DataTable的實現(xiàn)步驟

    C#操作DataTable的實現(xiàn)步驟

    本文主要介紹了C#操作DataTable的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • C#中靜態(tài)的深入理解

    C#中靜態(tài)的深入理解

    這篇文章詳細的介紹了C#中的靜態(tài),有需要的朋友可以參考一下
    2013-09-09
  • C#繼承IList?接口的實現(xiàn)步驟

    C#繼承IList?接口的實現(xiàn)步驟

    C#中的IList<T>接口是.NET框架中的一種通用接口,它定義了一組在運行時可以使用類型參數(shù)T的元素的集合,本文給大家介紹了C#繼承IList?接口的設計方法,文中通過代碼示例給大家介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • C#調用Oracle存儲過程的方法

    C#調用Oracle存儲過程的方法

    這篇文章主要介紹了C#調用Oracle存儲過程的方法,包含數(shù)據(jù)庫及C#對應的調用代碼,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • C# .NET中Socket簡單實用框架的使用教程

    C# .NET中Socket簡單實用框架的使用教程

    最近一個項目因為要用到Socket傳輸問題,所以決定學習一下,將自己學習的內容總結分享出來,下面這篇文章主要給大家介紹了關于C# .NET中Socket簡單實用框架使用的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-09-09
  • C# 大數(shù)據(jù)導出word的假死報錯的處理方法

    C# 大數(shù)據(jù)導出word的假死報錯的處理方法

    C# 大數(shù)據(jù)導出word的假死報錯的處理方法,需要的朋友可以參考一下
    2013-03-03

最新評論