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;
        }
    }   
时间: 2024-09-28 17:45:55

C#操控条形码扫描枪的相关文章

条形码扫描枪数据读取的问题

最近做的一个程序,客户端是使用条形码扫描枪,读取到数据后,要根据规则跳转到对应的网址. 在调试的时候发现,跳转地址时会出现错误,观察地址格式,发现多出来几个特殊的字符%0D%0A 找了一下原因,这是因为扫描枪传递过来的数据,尾部带有回车换行符(\r\n)所导致的,浏览器在做导航的时候,会自动将其编码为%0D%0A. 所以解决方法就是,使用正则表达式 \S+ 这样的规则,只提取数据中的字符,而不包含换行符之类的.

抓取扫描枪扫描数据的案例

背景: 最近要做一个抓取扫描枪扫描条形码获取条形码数据的功能,以前没有玩过扫描枪,但是因为做过很多其他方面的外设获取数据的项目,所以原理也明白,都是相当于键盘输入,所以相当的是通过获取键盘输入的方案实现,因为这个功能点是用于整个pc上所有扫描枪程序的数据的抓取,就是其他程序用扫描枪,我做的这个程序也能抓取到数据,并对数据进行相应的处理,至于数据处理那是后面自己所做的业务需求的处理了,和抓取扫描枪扫描数据无关了,所以可以通过全局键盘钩子抓取键盘的输入去实现,这样能够去获取每个键盘输入的值,想法有了

物流仓库用的是什么扫描枪?

我们知道在一些大型仓库中,各地零售商需要从仓库中接收产品.在这种环境下,我们光是从仓库中找到一条路就已够让人头痛,更不必说在占地好几英亩的走廊和存货架内找到某件物品了.所以有线扫描枪不适合大型仓库,我们一般大多使用无线扫描枪. 那么物流仓库行业对条码扫描枪有哪些特殊要求呢?这是我们选购物流仓库扫描枪的重点考虑因素,我们可以从以下几方面来分析. 在物流仓库收货时,可能几个人就需要处理大量的货物,这时候精准的数据输入是十分必要的,可以避免物流链中的一系列中的关联错误,所以物流仓库扫描枪最好能确保一次

软件开发必会的设备知识——扫描枪扫码识别解析视频课程

课程目标现在是信息化时代,也是扫描时代,作为软件开发IT人士,在开发软件的同时特别需要了解相关的硬件设备知识,只有了解硬件才可以开发与之相配套的软件.通过本课程的学习,了解扫描枪设备工作原理,以及如何识别整件条形码和单件条形码商品.适用人群电脑爱好者.所有职场人士,IT软件开发人员课程简介现在是信息化时代,也是扫描时代,作为软件开发IT人士,在开发软件的同时特别需要了解相关的硬件设备知识,只有了解硬件才可以开发与之相配套的软件.通过本课程的学习,了解扫描枪设备工作原理,以及如何识别整件条形码和单

“生成能够被扫描枪正常扫描出中文的二维码”

摆在我眼前的是一个急需解决的问题,那就是生成能够被扫描枪正常扫描出中文的二维码. 这事情领导已经交代清楚,这是新客户的需求,公司仓储部能不能接下这个新项目,这一步很关键,尽管前一天我接到这个任务时还感觉它根本不是个问题,但直到现在,这个问题依旧摆在我面前,它真的花费了我一些时间,而我尚未解决它. 二维码 二维码其实是个相对于条形码的概念,条形码是一维的,那二维码自然就是二维的了,虽然二维码有很多种,但我们平常说的二维码99%(甚至无限接近100%)指的就是QR码这种格式的二维码,QR码是一个日本

飞凌嵌入式FET1052-C解决方案 扫描枪方案

扫描枪是继键盘和鼠标之后的第三代主要的电脑输入设备.直接从图片.照片.胶片到各类图纸图形以及文稿资料都可以用扫描枪输入到计算机中,进而实现对这些图像信息的处理.管理.使用.存储或输出. 随着条形码技术的发展,扫描枪目前以广泛的应用到电力行业.交通运输业.物流行业.邮电通讯业.鞋服行业.行政执法等行业. 扫描枪构成: 常见的扫描枪一般由光源.光学透镜.扫描模组.模拟数字转换电路加塑料外壳构成. 扫描枪原理: 扫描枪通过打出的光源来扫描条码,通过条码的黑白条空所反射的光的巨大差别来识别条码,当扫描一

蓝牙扫描枪开发

1.蓝牙扫描枪 模式 HID SPP . 软件连接 须要把 模式调到SPP 模式,才干够用软件获取到扫描到的数据. 2. 在系统界面完毕 配对,然后再到 软件里面进行联接. 连接成功后.就能够获取到扫描抢,发过来的数据: 另 一些 开发经验 : http://blog.csdn.net/icyfox_bupt/article/details/25487125.

Ionic开发之条形码扫描

最近项目开发中有扫描条码的需求,查阅一些资料之后发现ngCordova扩展了cordova的插件–BarcodeScanner,提供了以下格式的条码扫描. QR Code Data Matrix UPC E UPC A EAN 8 EAN 13 Code 128 Code 39 ITF 完美的支持所有格式,插件本身使用流行的库ZXing. 将条码扫描器整合进Android和iOS应用的步骤如下: 1.新建项目 ionic start IonicProject blank cd IonicProj

ios条形码扫描技术

iOS 应用里实现条形码扫描功能,有个免费开源的 SDK:ZBar(http://zbar.sourceforge.net/iphone/sdkdoc/install.html)下面是实现的效果: 利用条形码,可以简单的得到二维码的值.具体的实现过程如下: 下载 ZBar 的 SDK 创建工程,iphone.scanbar 把下载的 ZBarSDK 添加到工程中 添加 .framework 到工程中 添加一个按钮,处理效果. #pragma mark –    #pragma mark onCl