• C#操控 条形码扫描枪


    对于这样类似的资料,平时觉得没有什么,但是当你遇到时一时找不到还会有些着急,所以收藏了。。。。

    代码
    // 条码扫描器

    // 窗体部分相关代码:

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

    namespace ReadBadCode
    {
    public partial class frmTest : Form
    {
    BarCodeHook BarCode
    = new BarCodeHook();
    public frmTest()
    {
    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();
    textBox5.Text
    = barCode.Chr.ToString();
    textBox6.Text
    = barCode.IsValid ? barCode.BarCode : "";
    }
    }

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

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

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

    private void textBox6_TextChanged(object sender, EventArgs e)
    {
    if (textBox6.Text.Length > 0)
    {
    MessageBox.Show(textBox6.Text);
    }
    }
    }
    }

    BarCodeHook 类相关代码:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Reflection;

    namespace ReadBadCode
    {
    public 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);

    [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;
    }
    }


    本文来自CSDN博客,转载请标明出处:http:
    //blog.csdn.net/yefanqiu/archive/2009/05/03/4146580.aspx#


    返回导读目录,阅读更多随笔



    分割线,以下为博客签名:

    软件臭虫情未了
    • 编码一分钟
    • 测试十年功


    随笔如有错误或不恰当之处、为希望不误导他人,望大侠们给予批评指正。

  • 相关阅读:
    前端线上项目汇总
    gulp构建工具学习汇总
    ES6知识点汇总
    页游技术点汇总中
    前后端方案汇总
    vim常用命令
    互联网哲学
    js调试技巧汇总中
    windows下Docker安装MySQL
    RabbitMQ几个常用面试题
  • 原文地址:https://www.cnblogs.com/08shiyan/p/1864901.html
Copyright © 2020-2023  润新知