擷取鍵盤輸入或者USB掃描槍資料

來源:互聯網
上載者:User

標籤:

/// <summary>    /// 擷取鍵盤輸入或者USB掃描槍資料 可以是沒有焦點 應為使用的是全域鉤子    /// USB掃描槍 是類比鍵盤按下    /// 這裡主要處理掃描槍的值,手動輸入的值不太好處理    /// </summary>    public class BardCodeHooK    {        public delegate void BardCodeDeletegate(BarCodes barCode);        public event BardCodeDeletegate BarCodeEvent;        //定義成靜態,這樣不會拋出回收異常        private static HookProc hookproc;        public struct BarCodes        {            public int VirtKey;//虛擬嗎            public int ScanCode;//掃描碼            public string KeyName;//鍵名            public uint Ascll;//Ascll            public char Chr;//字元            public string OriginalChrs; //原始 字元            public string OriginalAsciis;//原始 ASCII            public string OriginalBarCode;  //未經處理資料條碼            public bool IsValid;//條碼是否有效            public DateTime Time;//掃描時間,            public string BarCode;//條碼資訊   儲存最終的條碼        }        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 IParam, StringBuilder lpBuffer, int nSize);        [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[] lpKeySate, ref uint lpChar, int uFlags);        [DllImport("kernel32.dll")]        public static extern IntPtr GetModuleHandle(string name);        delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);        BarCodes barCode = new BarCodes();        int hKeyboardHook = 0;        // string strBarCode = "";        StringBuilder sbBarCode = new StringBuilder();        private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)        {            int i_calledNext = -10;            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(225);                    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 (barCode.KeyName.Equals("A") || barCode.KeyName.Equals("a"))                    //  {                    if (ToAscii(barCode.VirtKey, barCode.ScanCode, kbArray, ref uKey, 0))                    {                        barCode.Ascll = uKey;                        barCode.Chr = Convert.ToChar(uKey);                        barCode.OriginalChrs += " " + Convert.ToString(barCode.Chr);                        barCode.OriginalAsciis += " " + Convert.ToString(barCode.Ascll);                        barCode.OriginalBarCode += Convert.ToString(barCode.Chr);                    }                    // }                    TimeSpan ts = DateTime.Now.Subtract(barCode.Time);                    if (ts.TotalMilliseconds > 30)                    {//時間戳記,大於50 毫秒錶示手動輸入                        // strBarCode = barCode.Chr.ToString();                        sbBarCode.Remove(0, sbBarCode.Length);                        sbBarCode.Append(barCode.Chr.ToString());                        barCode.OriginalChrs = " " + Convert.ToString(barCode.Chr);                        barCode.OriginalAsciis = " " + Convert.ToString(barCode.Ascll);                        barCode.OriginalBarCode = Convert.ToString(barCode.Chr);                    }                    else                    {                        if ((msg.message & 0xff) == 13 && sbBarCode.Length > 3)                        {//斷行符號                            // barCode.BarCode = strBarCode;                            // barCode.BarCode = sbBarCode.ToString();                            barCode.BarCode = barCode.OriginalBarCode;                            barCode.IsValid = true;                            //strBarCode = "";                            sbBarCode.Remove(0, sbBarCode.Length);                        }                        //                        //strBarCode += barCode.Chr.ToString();//  updated by dragon 20141124                        sbBarCode.Append(barCode.Chr.ToString());                        //strBarCode += barCode.KeyName;                        // strBarCode += barCode.VirtKey.ToString();                    }                    try                    {                        if (BarCodeEvent != null && barCode.IsValid)                        {                            //barCode.BarCode = barCode.BarCode.Replace("\b", "").Replace("\0","");  可以不需要 因為大於50毫秒已經處理                            //先進行 WINDOWS事件往下傳                            i_calledNext = CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);                            BarCodeEvent(barCode);//觸發事件                            barCode.BarCode = "";                            barCode.OriginalChrs = "";                            barCode.OriginalAsciis = "";                            barCode.OriginalBarCode = "";                        }                    }                    catch { }                    finally                    {                        barCode.IsValid = false; //最後一定要 設定barCode無效                        barCode.Time = DateTime.Now;                    }                }            }            if (i_calledNext == -10)            {                i_calledNext = CallNextHookEx(hKeyboardHook, nCode, wParam, lParam);            }            return i_calledNext;        }        //安裝鉤子        public bool Start()        {            if (hKeyboardHook == 0)            {                hookproc = new HookProc(KeyboardHookProc);                //GetModuleHandle 函數 替代 Marshal.GetHINSTANCE                //防止在 framework4.0中 註冊鉤子不成功                IntPtr modulePtr = GetModuleHandle(Process.GetCurrentProcess().MainModule.ModuleName);                //WH_KEYBOARD_LL=13                //全域鉤子 WH_KEYBOARD_LL                //  hKeyboardHook = SetWindowsHookEx(13, hookproc, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);                hKeyboardHook = SetWindowsHookEx(13, hookproc, modulePtr, 0);            }            return (hKeyboardHook != 0);        }        //卸載鉤子        public bool Stop()        {            if (hKeyboardHook != 0)            {                return UnhookWindowsHookEx(hKeyboardHook);            }            return true;        }    }

  

頁面中用法:

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Common
{
    public partial class FrmMain : Form
    {
        BardCodeHooK BarCode = new BardCodeHooK();
        public FrmMain()
        {
            InitializeComponent();
            BarCode.BarCodeEvent += new BardCodeHooK.BardCodeDeletegate(BarCode_BarCodeEvent);
        }

        private delegate void ShowInfoDelegate(BardCodeHooK.BarCodes barCode);
        private void ShowInfo(BardCodeHooK.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.Ascll.ToString();
                textBox5.Text = barCode.Chr.ToString();
                textBox6.Text = barCode.IsValid? barCode.BarCode : "";//是否為掃描槍輸入,如果為true則是 否則為鍵盤輸入
                textBox7.Text += barCode.KeyName;
                //MessageBox.Show(barCode.IsValid.ToString());
            }
        }

        //C#中判斷掃描槍輸入與鍵盤輸入

        //Private DateTime _dt = DateTime.Now;  //定義一個成員函數用於儲存每次的時間點
        //private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        //{
        //    DateTime tempDt = DateTime.Now;          //儲存按鍵按下時刻的時間點
        //    TimeSpan ts = tempDt .Subtract(_dt);     //擷取時間間隔
        //    if (ts.Milliseconds > 50)                           //判斷時間間隔,如果時間間隔大於50毫秒,則將TextBox清空
        //        textBox1.Text = "";
        //    dt = tempDt ;
        //}

 

        void BarCode_BarCodeEvent(BardCodeHooK.BarCodes barCode)
        {
            ShowInfo(barCode);
        }

        private void FrmMain_Load(object sender, EventArgs e)
        {
            BarCode.Start();
        }

        private void FrmMain_FormClosed(object sender, FormClosedEventArgs e)
        {
            BarCode.Stop();
        }

        private void textBox6_TextChanged(object sender, EventArgs e)
        {
            if (textBox6.Text.Length > 0)
            {
                MessageBox.Show("條碼長度:" + textBox6.Text.Length + "\n條碼內容:" + textBox6.Text, "系統提示");
            }
        }
    }
}

 

轉載:http://www.cnblogs.com/Hdsome/archive/2011/11/15/2227717.html

擷取鍵盤輸入或者USB掃描槍資料

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.