搞过扫描枪的来!!!!

时间:2022-03-11 07:48:23
程序中有个页面生成条码打印出来,然后通过扫描枪将条码扫描出来,输入到另一个页面的文本框中,进行查询数据。但问题是,扫描枪只要有光标定到可输入的文本框中就会将数据输入到那个文本框中,我想要的是,只要有条码经过扫描枪扫描过我就会自动跳到指定的页面然后在指定的文本框中输入扫描出来的数据。进行查询。

16 个解决方案

#1


虽然不知道楼主说什么,但好像很厉害的样子~帮顶了

#2


就是我想要扫描枪中的数据,虽然现在可以获取到,但是只要页面有可输入的文本框或者其他的什么,只要有光标定在那里,扫描枪就会将扫描的数据输入到有光标的文本框中。
我想要的是 只要有扫描枪扫描,我就将扫描的数据直接放到指定页面上的指定文本框中。

#3


扫描枪应该是发的键盘消息吧,拦截下键盘消息试试

#4


持扫描器的人不扫,它怎么输入?

它扫了一个条码,难道是要重复成千上万次地去输入?那么到底是扫了一个条码还是一万个(同样的)条码?

设计一个程序,连先后依赖关系都不懂(不懂得依赖倒置的道理),那么做出的需求描述往往跟编程完全对接不上。

#5


引用 4 楼 sp1234 的回复:
持扫描器的人不扫,它怎么输入?

它扫了一个条码,难道是要重复成千上万次地去输入?那么到底是扫了一个条码还是一万个(同样的)条码?

设计一个程序,连先后依赖关系都不懂(不懂得依赖倒置的道理),那么做出的需求描述往往跟编程完全对接不上。

肯定要扫描啊?不扫描数据从哪来?

#6


引用 3 楼 assky124 的回复:
扫描枪应该是发的键盘消息吧,拦截下键盘消息试试

我可以通过程序获取到按键,但是我测了一下,扫描枪是先将数据输入到你的光标位置,然后才会触发按键比如Enter回车键

#7


SerialPort类,希望可以帮到你。 搞过扫描枪的来!!!!

#8


首先撸主的思路有问题。

条形码扫描抢是输入键盘事件,你可以把它看作一个键盘。
那么问题就变成了你在一个界面上要知道获取键盘IO的输入,你该怎么做?

你的程序进入了扫描环节,那么在这个界面上一定只有输入框能够获取到焦点。这样就不存在你的问题了。

#9


楼主的问题貌似实现不了,不过可以换个折中的思路,在当前页面中有个默认的回车会触发的按钮,在这个按钮中判断指定的接收扫描或输入条码的文本框是否有内容,如果有则打开新页面并传入条码,并在新页面中根据参数中的条码检索数据,平时接收条码都是在当前的页面中

#10


楼主这个问题,有一种解决方法,

你需要更改条码枪规则,操作方法请看条码枪的说明书(有一本小册子上记录了许多配置条码)

原理: 条码枪每次扫描前让它加上一个前缀字符,你在程序中过滤键盘消息专门拦截这个字符,然后跳到你指定的页面。将拦到的字符串放到textbox中.

否则别无它法  完毕。 

#11


扫描设备 应该也是有 事件驱动的
在扫描事件里写你需要做的操作呗

#12


是asp.net还是winform,winform好办,

#13


stonespace 老兄,Winform下的话该如何处理呢?

#14


把窗体或页面上的所有能接收键盘事件的控件,将其keydown事件注册到窗体或页面上,然后在窗体或页面上的keydown事件去处理,

#15


已解决此问题,我的做法如下。
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, "系统提示");
            }
        }
    }
}

#16


引用 15 楼 liuchengbjaccp 的回复:
已解决此问题,我的做法如下。
C# code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677using System;using……

BardCodeHooK 这个是哪来的?

#1


虽然不知道楼主说什么,但好像很厉害的样子~帮顶了

#2


就是我想要扫描枪中的数据,虽然现在可以获取到,但是只要页面有可输入的文本框或者其他的什么,只要有光标定在那里,扫描枪就会将扫描的数据输入到有光标的文本框中。
我想要的是 只要有扫描枪扫描,我就将扫描的数据直接放到指定页面上的指定文本框中。

#3


扫描枪应该是发的键盘消息吧,拦截下键盘消息试试

#4


持扫描器的人不扫,它怎么输入?

它扫了一个条码,难道是要重复成千上万次地去输入?那么到底是扫了一个条码还是一万个(同样的)条码?

设计一个程序,连先后依赖关系都不懂(不懂得依赖倒置的道理),那么做出的需求描述往往跟编程完全对接不上。

#5


引用 4 楼 sp1234 的回复:
持扫描器的人不扫,它怎么输入?

它扫了一个条码,难道是要重复成千上万次地去输入?那么到底是扫了一个条码还是一万个(同样的)条码?

设计一个程序,连先后依赖关系都不懂(不懂得依赖倒置的道理),那么做出的需求描述往往跟编程完全对接不上。

肯定要扫描啊?不扫描数据从哪来?

#6


引用 3 楼 assky124 的回复:
扫描枪应该是发的键盘消息吧,拦截下键盘消息试试

我可以通过程序获取到按键,但是我测了一下,扫描枪是先将数据输入到你的光标位置,然后才会触发按键比如Enter回车键

#7


SerialPort类,希望可以帮到你。 搞过扫描枪的来!!!!

#8


首先撸主的思路有问题。

条形码扫描抢是输入键盘事件,你可以把它看作一个键盘。
那么问题就变成了你在一个界面上要知道获取键盘IO的输入,你该怎么做?

你的程序进入了扫描环节,那么在这个界面上一定只有输入框能够获取到焦点。这样就不存在你的问题了。

#9


楼主的问题貌似实现不了,不过可以换个折中的思路,在当前页面中有个默认的回车会触发的按钮,在这个按钮中判断指定的接收扫描或输入条码的文本框是否有内容,如果有则打开新页面并传入条码,并在新页面中根据参数中的条码检索数据,平时接收条码都是在当前的页面中

#10


楼主这个问题,有一种解决方法,

你需要更改条码枪规则,操作方法请看条码枪的说明书(有一本小册子上记录了许多配置条码)

原理: 条码枪每次扫描前让它加上一个前缀字符,你在程序中过滤键盘消息专门拦截这个字符,然后跳到你指定的页面。将拦到的字符串放到textbox中.

否则别无它法  完毕。 

#11


扫描设备 应该也是有 事件驱动的
在扫描事件里写你需要做的操作呗

#12


是asp.net还是winform,winform好办,

#13


stonespace 老兄,Winform下的话该如何处理呢?

#14


把窗体或页面上的所有能接收键盘事件的控件,将其keydown事件注册到窗体或页面上,然后在窗体或页面上的keydown事件去处理,

#15


已解决此问题,我的做法如下。
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, "系统提示");
            }
        }
    }
}

#16


引用 15 楼 liuchengbjaccp 的回复:
已解决此问题,我的做法如下。
C# code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677using System;using……

BardCodeHooK 这个是哪来的?