• Winform让扫描枪听话,防止在有焦点的地方就扫码输入的尴尬


    关注点

    • 1、扫描枪在扫描到条码后会在有焦点的地方显示扫描到的条码并且可设置扫码后添加回车换行让我很尴尬
    • 2、怎样拦截扫码输入,扫描到条码就自动会嘀一声。不要这么智能行不行。瞎BB

    需求详解

    公司生产车间要上几条线的过程管控系统,由于没办法实现先进的自动化,全是用手持扫描枪USB接口的那种来作业,来识别产品半成品的标识,进行记录和管控。方便实现追溯。前人都是拖控件,拖个TextBox就了事,在KeyPress里收到回车换行就认为是一次扫描操作。去年搞了一年多的综合赋码软件,对软件的动态编译、和界面脚本分离的做法深深折服,于是随便参考一把,搭建了自己的业务应用框架。这里讲一下其中一点心得就是关于这个小事情的处理。

    实现方式说明

     /// <summary>
            /// 响应扫描枪输入
            /// </summary>
            /// <param name="msg"></param>
            /// <param name="keyData"></param>
            /// <returns></returns>
            protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
            {
                if (msg.Msg == 0x0100 && ContextMenuStrip != null)
                {
                    foreach (ToolStripMenuItem item in ContextMenuStrip.Items)
                    {
                        if (keyData == item.ShortcutKeys)
                        {
                            item.PerformClick();
                        }
                    }
                }
                if (msg.Msg == 0x0100 && keyData == Keys.Enter)
                {
                    string barcode = onceScanData;
                    onceScanData = string.Empty;
                    if (CoreFlowObj != null && FlowContext.Instance.WorkStatus == WorkStatus.Running && !string.IsNullOrEmpty(barcode))
                    {
                        CoreFlowObj.OnExecScanReceiving(TrimSpecialChar(barcode));
                    }
                    else
                        OnScanReceivingData(TrimSpecialChar(barcode));
                }
                else
                {
                    int key = (int)keyData;
                    if (key >= (int)Keys.A && key <= (int)Keys.Z ||
                        key >= (int)Keys.D0 && key <= (int)Keys.D9 ||
                        key >= (int)Keys.NumPad0 && key <= (int)Keys.NumPad9 || 
                        key > 65000)
                    {
                        #region 无赖,希望找到更好的办法
                        if (keyData == Keys.NumPad0)
                            keyData = Keys.D0;
                        if (keyData == Keys.NumPad1)
                            keyData = Keys.D1;
                        if (keyData == Keys.NumPad2)
                            keyData = Keys.D2;
                        if (keyData == Keys.NumPad3)
                            keyData = Keys.D3;
                        if (keyData == Keys.NumPad4)
                            keyData = Keys.D4;
                        if (keyData == Keys.NumPad5)
                            keyData = Keys.D5;
                        if (keyData == Keys.NumPad6)
                            keyData = Keys.D6;
                        if (keyData == Keys.NumPad7)
                            keyData = Keys.D7;
                        if (keyData == Keys.NumPad8)
                            keyData = Keys.D8;
                        if (keyData == Keys.NumPad9)
                            keyData = Keys.D9;
                        #endregion
                        onceScanData += (char)keyData;
                    }
                }
                if (FlowContext.Instance.WorkStatus != WorkStatus.Running)
                    return base.ProcessCmdKey(ref msg, keyData);
                else
                    return true;
            }
    简单说就是重写ProcessCmdKey事件拦截处理扫描的输入。不直接在界面控件的事件里处理,把界面的TextBox都设置成ReadOnly,在窗体的ProcessCmdKey里处理。然后把收到的条码传给脚本进行解析。
  • 相关阅读:
    OpenGL光栅化作业:【bresenham算法】GL_POINTS为基础画圆
    OpenGL光栅化作业:【bresenham算法】GL_POINTS为基础画线段
    GIT 4 (标签)
    用户组 vim yum
    Git (提交版本及版本回退)
    GIT服务器的搭建
    GIT 2 (工作区,暂存库,版本库对比)
    用户的管理
    文档搜索
    GIT 3 (推送与克隆 及 分支管理)
  • 原文地址:https://www.cnblogs.com/datacool/p/datacool2018042402.html
Copyright © 2020-2023  润新知