關注點:
- 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里處理。然后把收到的條碼傳給腳本進行解析。
