亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

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

2020-01-24 01:52:02
字體:
來源:轉載
供稿:網友

本文實例講述了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);  // 繼續下一個鉤子  [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;  } }}

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成**性毛茸茸| 国产精品久久久久一区二区| 成人网页在线免费观看| 亚洲免费影视第一页| 日韩视频免费大全中文字幕| 日韩av免费在线看| 色999日韩欧美国产| 国产成人+综合亚洲+天堂| 色黄久久久久久| 91精品国产高清| 国产精品美女主播| 91美女福利视频高清| 国模精品视频一区二区| 这里只有精品视频在线| 国产精品久久久久久久久久三级| 91av视频在线免费观看| 久热精品视频在线观看一区| 国产视频自拍一区| 国产精品永久免费| 91av福利视频| 亚洲网站在线观看| 欧美亚洲在线播放| 日韩高清有码在线| 久久艳片www.17c.com| 色综合影院在线| 欧美精品18videos性欧美| 欧美网站在线观看| 日韩欧美在线免费| 尤物yw午夜国产精品视频| 日韩一区二区三区国产| 一本大道香蕉久在线播放29| 欧美激情在线狂野欧美精品| 国自产精品手机在线观看视频| 中文字幕欧美精品在线| 国产欧美精品va在线观看| 亚洲第一区在线| 日韩在线视频免费观看高清中文| 久久久日本电影| 久久91亚洲人成电影网站| 国产小视频91| 97色在线观看免费视频| 91日本在线观看| 成人黄色片网站| 97国产精品视频人人做人人爱| 中文字幕日韩在线播放| 国产不卡精品视男人的天堂| 久久综合亚洲社区| 影音先锋欧美精品| 欧美丝袜一区二区| 97成人精品区在线播放| www国产亚洲精品久久网站| 97视频在线看| 国内精品视频一区| 久久人人爽人人爽爽久久| 国产精品扒开腿爽爽爽视频| 国产97免费视| 欧美成人激情视频免费观看| 欧美性xxxx18| 国产精品第100页| 26uuu国产精品视频| 国产在线98福利播放视频| 91亚洲精品一区| 欧美激情精品久久久久久蜜臀| 国产不卡一区二区在线播放| 日韩av在线免费观看| 中文字幕久热精品视频在线| 亚洲第一精品电影| 亚洲欧洲一区二区三区在线观看| 成人午夜一级二级三级| 富二代精品短视频| 国产精品亚洲第一区| 日韩中文字幕在线播放| 成人精品视频久久久久| 国产日韩av在线播放| 成人疯狂猛交xxx| 永久免费看mv网站入口亚洲| 久久影院中文字幕| 亚洲二区在线播放视频| 亚洲综合日韩中文字幕v在线| 国内久久久精品| 69视频在线播放| 欧美性猛交xxxx黑人猛交| 国产成人免费91av在线| 日韩专区中文字幕| 日韩av网站导航| 性亚洲最疯狂xxxx高清| 国产男女猛烈无遮挡91| 成人黄色免费在线观看| 国产免费成人av| 欧美性生活大片免费观看网址| 欧美日韩不卡合集视频| 亚洲字幕一区二区| 中文字幕亚洲欧美日韩在线不卡| 欧美华人在线视频| 精品国产欧美成人夜夜嗨| 国产精品成人久久久久| 国产精品一区专区欧美日韩| 国产精品中文久久久久久久| 成人国产精品一区二区| 日韩免费电影在线观看| xxx成人少妇69| 欧美成人三级视频网站| 国产日韩精品入口| 国产精品亚洲аv天堂网| 欧美精品在线观看91| 欧美午夜电影在线| 91在线视频九色| 国产精品久久精品| 日本精品久久电影| 欧美激情视频在线免费观看 欧美视频免费一| 欧美高清不卡在线| 国产精品私拍pans大尺度在线| 国产成人精品a视频一区www| 欧美激情亚洲激情| 蜜臀久久99精品久久久久久宅男| 国产精品久久久久久网站| 成人xvideos免费视频| 亚洲精品综合精品自拍| 日韩av影视综合网| 欧美激情视频网| 亚洲人成在线观| 日韩av一区二区在线观看| 中文字幕亚洲欧美| 91久久国产精品| 久久免费视频网| 国产精品视频99| 精品亚洲国产成av人片传媒| 亚洲人成在线一二| 午夜免费久久久久| 国产精品视频大全| 一区二区三区回区在观看免费视频| 成人激情视频在线播放| 国模精品一区二区三区色天香| 成人精品aaaa网站| 精品久久久久久久久久久久久久| 国产精品18久久久久久麻辣| 欧美精品一区二区免费| 国产免费观看久久黄| 色琪琪综合男人的天堂aⅴ视频| 国语自产精品视频在线看抢先版图片| 在线观看日韩专区| 欧美xxxx综合视频| 亚洲无亚洲人成网站77777| 日韩美女在线观看一区| 亚洲黄色成人网| 中文字幕日韩高清| 欧美激情2020午夜免费观看| 日韩精品在线观看一区二区| 97视频在线看| 欧美精品videos| 狠狠躁夜夜躁人人爽超碰91| 亚洲人成免费电影| 欧美在线视频观看免费网站| 色婷婷综合成人av| 久久亚洲国产成人| 亚洲人精品午夜在线观看| 美女视频久久黄| 久久九九精品99国产精品| 久久夜精品va视频免费观看| 欧美一区亚洲一区| 亚洲自拍小视频| 免费av一区二区| 欧美肥老妇视频| 中文字幕精品—区二区|