首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

C#扫码枪读值,该怎么解决

2013-12-04 
C#扫码枪读值现在遇到问题:C#扫码枪如何读值?求C#扫码枪读值的实例!谢谢!邮箱1007109573@163.comC#?扫码枪

C#扫码枪读值
现在遇到问题:C#扫码枪如何读值?
求C#扫码枪读值的实例!谢谢!
邮箱1007109573@163.com C#?扫码枪?读值
[解决办法]
你说的是条码扫描设备吧,其实它就是一个键盘输入,你把它当键盘输入即可
[解决办法]
读取一个字符串的问题
[解决办法]
兩種方法:
1,把條碼槍當做鍵盤輸入設備,剩下就當做鍵盤輸入來考慮;
2,找到你所用的條碼槍提供的API,調用相關API獲取,可能涉及到WIN32的相關API。
[解决办法]


/*
Device開頭的都是PDA設備提供的API函數
Win32開頭的就是Win32相關API
這個設備是WIN CE 5.0系統
*/
public class DecodeEventArgs : EventArgs
    {
        private string barcode;
        private byte type;

        public DecodeEventArgs(string barcodeData, byte typeData)
        {
            barcode = barcodeData;
            type = typeData;
        }

        public string Barcode
        {
            get { return barcode; }
            set { barcode = value; }
        }

        public byte Type
        {
            get { return type; }
            set { type = value; }
        }

    }

    class Scanner
    {
        public event EventHandler<DecodeEventArgs> DecodeEvent;

        private bool needClose = false;

        private IntPtr[] hEvent = new IntPtr[2];
        private IntPtr hNotify = IntPtr.Zero;

        private Thread scanThread;

        private bool isContinuousMode;
        public bool IsContinuousMode
        {
            get { return isContinuousMode; }
            set { isContinuousMode = value; }
        }

        public bool Start()
        {

            if (Device.SCA_GetPowerStatus() == 0)
            {
                Device.SCA_EnableModule();
                needClose = true;
            }

            Win32.MSGQUEUEOPTIONS options = new Win32.MSGQUEUEOPTIONS();
            options.dwSize = 20;
            options.dwFlags = 2;
            options.dwMaxMessages = 3;
            options.cbMaxMessage = 252;
            options.bReadAccess = true;

            IntPtr hMsgQ = Win32.CreateMsgQueue(null, options);
            if (hMsgQ == IntPtr.Zero)


            {
                return false;
            }

            hNotify = Device.SCA_RegisterNotification(hMsgQ);
            if (hNotify == IntPtr.Zero)
            {
                return false;
            }

            hEvent[0] = Win32.CreateEvent(IntPtr.Zero, false, false, null);
            hEvent[1] = hMsgQ;

            scanThread = new Thread(new ThreadStart(this.ScanThreadPorc));
            scanThread.Start();

            return true;

        }

        public void Stop()
        {
            try
            {
                Win32.EventModify(hEvent[0], Win32.EVENT_SET);
                if (!scanThread.Join(3000))
                {
                    scanThread.Abort();
                }
            }
            catch (Exception ex)
            {
            }
            Win32.CloseHandle(hEvent[0]);

            Device.SCA_UnRegisterNotification(hNotify);
            Win32.CloseHandle(hEvent[1]);

            if (needClose)
            {
                Device.SCA_DisableModule();
            }
            else  if (isContinuousMode)
            {
                Device.SCA_SetTriggerMode(Device.TriggerMode.Normal);
            }

        }

        private void ScanThreadPorc()
        {
            while (true)
            {
                uint evt = Win32.WaitForMultipleObjects(2, hEvent, false, Win32.INFINITE);
                switch (evt)
                {
                    case 0://return thread
                        return;
                    case 1://disable network 
                        uint bytesRead;
                        uint flags;

                        byte[] buf = new byte[256];
 
                        if (Win32.ReadMsgQueue(hEvent[1], buf, 256, out bytesRead, Win32.INFINITE, out flags))


                        {
                             EventHandler<DecodeEventArgs> temp = DecodeEvent;
                             if (temp != null)
                             {
                                 temp(this, new DecodeEventArgs(Encoding.Default.GetString(buf, 2, (int)bytesRead), buf[1]));
                             }
                        }
                        break;
                }
            }
        }

    }


public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Scanner scanner = new Scanner();
        private void Form1_Load(object sender, EventArgs e)
        {
             //判斷掃描槍頭是否打開,這裡是用的PDA的API函數
            if (Device.SCA_GetPowerStatus() == 0)
            {
                Device.SCA_EnableModule();
            }
            txtBarCode.Focus();
            scanner.DecodeEvent += new EventHandler<DecodeEventArgs>(scanner_DecodeEvent);
            scanner.Start();
        }
       void scanner_DecodeEvent(object sender, DecodeEventArgs e)
        {
            this.BeginInvoke((Action<string>)delegate(string barcode)
            {
                txtBarCode.Text = barcode;
                txtBarCode.Focus();
                Win32.Keybd_event(0x0D, 0, 0, 0); //模擬鍵盤輸入一個回車
            }, e.Barcode);
        }

        private void Form1_Closed(object sender, EventArgs e)
        {
            if (Device.SCA_GetPowerStatus() == 1)
            {
                Device.SCA_DisableModule();
            }
            scanner.Stop();
        }
    }


[解决办法]
1.要知道条码枪通过什么接口传输数据;
2.要知道条码枪厂商的传输数据的通信协议。
[解决办法]
C#扫码枪读值,该怎么解决
现在的扫码枪99%都不用什么接口驱动了。直挡可以接建盘口或USB口,扫完自动在光标处输出文本了。
现在还有那么奇特的要自己程序实现。。。。
[解决办法]

现在的扫码枪99%都不用什么接口驱动了。直挡可以接建盘口或USB口,扫完自动在光标处输出文本了。
现在还有那么奇特的要自己程序实现。。。。

當做鍵盤輸入會有很多不方便的地方...
[解决办法]
引用:
Quote: 引用:


C#扫码枪读值,该怎么解决
现在的扫码枪99%都不用什么接口驱动了。直挡可以接建盘口或USB口,扫完自动在光标处输出文本了。
现在还有那么奇特的要自己程序实现。。。。


當做鍵盤輸入會有很多不方便的地方...


不会呀,我们都是用这个。弄个双口的PS2转接口。一个口接建盘一个口接扫描枪
还有一种是接USB的扫描枪,也是不用驱什么的,直接插上就可以用了。
[解决办法]

现在的扫码枪99%都不用什么接口驱动了。直挡可以接建盘口或USB口,扫完自动在光标处输出文本了。
现在还有那么奇特的要自己程序实现。。。。

當做鍵盤輸入會有很多不方便的地方...

不会呀,我们都是用这个。弄个双口的PS2转接口。一个口接建盘一个口接扫描枪
还有一种是接USB的扫描枪,也是不用驱什么的,直接插上就可以用了。

还有很多手持带内存的扫描仪。

热点排行