分类:编程开å‘
语言:简体中文
大小:未知
发布时间:19-05-01
䏋颿˜¯å¦ä¹ 资料下载列表,您å¯ä»¥ç‚¹å‡»è¿™äº›æ–‡
ä»¶å进行下载,如果ä¸èƒ½ä¸‹è½½ï¼Œè¯·æŸ¥çœ‹ä¸‹è½½å¸®åŠ©
Barcode[www.minxue.net].zip
39.36 KB
www.minxue.net电å书
æ¡ç æžªçš„æ— ç„¦ç‚¹æ‰«ç æºç
在上一家公å¸åˆ›ä¸šåˆæœŸï¼Œæˆ‘接触的第一个项目是医院的供应室消毒包管ç†ç³»ç»Ÿï¼Œå‡ 乎一人之力用了两个多月的时间,完æˆäº†åŸºæœ¬çš„å¼€å‘工作。回想起æ¥ï¼Œå½“时有个设计å°è±¡æ·±åˆ»ã€‚è¶ç€è¿˜æœ‰è®°å¿†ï¼Œè®°å½•下æ¥ï¼Œä¾›å¤§å®¶ä¸€æ—¶ä¹‹éœ€ã€‚当时开å‘的时候,对于物资的管ç†ï¼Œè‡ªç„¶ç¦»ä¸å¼€æ¡ç æžªçš„è§’è‰²ã€‚è®¾è®¡çš„æ˜¯æ— çº¿æ¡ç 枪,让工作人员å¯ä»¥è‡ªç”±çš„在作业现场走动。但是有个用户体验问题,就是一般情况下,æ¡ç 枪扫æçš„æ—¶å€™ï¼Œéƒ½éœ€è¦å°†è¾“入焦点放到文本框之ä¸ï¼Œè¿™ä¸ªé™åˆ¶ä¼šé€ æˆæžä¸ºä¸å¥½çš„用户体验。æ¤å¤–,在æµç¨‹è®¾è®¡çš„æ—¶å€™ï¼Œå®žé™…上一系列æ“作动作,是使用扫æä¸åŒå‘½ä»¤æ¡ç åŽï¼Œå®žçŽ°çš„ã€‚æ¯”å¦‚å¯åЍæŸåŠŸèƒ½ï¼Œæ‰«ç åŽï¼Œç¡®å®šç»§ç»ä¸‹ä¸€ä¸ªåŠ¨ä½œç‰ç‰ï¼Œå…¨ç¨‹ä¸ç”¨ç¢°PCæœºã€‚æ‰€ä»¥é—®é¢˜çš„æ ¸å¿ƒå°±åœ¨äºŽæ˜¯å¦å¯ä»¥æŽ¥è§¦ç„¦ç‚¹å¿…须放到文本框之ä¸çš„é™åˆ¶ã€‚æ¤æ–¹æ³•并䏿˜¯åŽŸåˆ›ï¼Œä½†æ˜¯åŽŸå§‹ä»£ç æ˜¯å¯¹WinFormå¹³å°è¿›è¡Œå¼€å‘的,被我修改为支æŒWPFå¹³å°ã€‚并且原文的链接已ç»å¤±æ•ˆï¼Œæ‰€ä»¥è¿™æ®µä»£ç 还是很有价值的。 使用WindowInteropHelper获å–ä¼ å…¥çª—ä½“çš„å¥æŸ„,并且绑定ThreadFilterMessage事件,达到从而å¯ä»¥è§¦å‘ProcessRawInputMessage方法 /// <summary> /// 将监å¬å™¨é™„ç€åˆ°çª—体上 /// </summary> /// <param name="form">需è¦é™„ç€çš„窗体(WPF)</param> public void Attach(Window form) { var helper = new WindowInteropHelper(form); IntPtr hwnd = helper.Handle; form.KeyDown += (sender, args) => { if (_ControlHandled) { args.Handled = true; _ControlHandled = false; } }; DoAttach(hwnd); } /// <summary> /// 监å¬ç»‘定 /// </summary> /// <param name="hwnd">设备指针</param> private void DoAttach(IntPtr hwnd) { this.keystrokeBuffer = new StringBuilder(); this.InitializeBarcodeScannerDeviceHandles(); this.interopHelper.HookRawInput(hwnd); //this.HookHandleEvents(form); //this.AssignHandle(ptr); this.filter = new BarcodeScannerKeyDownMessageFilter(); ComponentDispatcher.ThreadFilterMessage -= ComponentDispatcher_ThreadFilterMessage; ComponentDispatcher.ThreadFilterMessage += ComponentDispatcher_ThreadFilterMessage; //Application.AddMessageFilter(this.filter); } ProcessRawInputMessage方法ä¸ï¼Œåˆ¤æ–ä¼ å…¥çš„å—ç¬¦ä¸²æ˜¯å¦æ˜¯æ‰«ç 枪设置的结æŸå—符(扫ç çš„å—ç¬¦ä¸²æ˜¯ä¸€ä¸ªä¸€ä¸ªä¼ å…¥çš„ï¼‰ï¼Œå¦‚æžœä¸æ˜¯ï¼Œå°±åŠ å…¥åˆ°Bufferä¸ï¼Œå¦‚果是,则触å‘FireBarcodeScanned方法 /// <summary> /// 处ç†WM_INPUTæ¶ˆæ¯ /// </summary> /// <param name="rawInputHeader">rawInputHeader的指针</param> /// <returns>按键是å¦è¢«å¤„ç†</returns> private bool ProcessRawInputMessage(IntPtr rawInputHeader) { BarcodeScannerDeviceInfo deviceInfo; bool handled; bool keystroke; string localBuffer; IntPtr rawInputDeviceHandle; handled = false; keystroke = false; localBuffer = string.Empty; rawInputDeviceHandle = IntPtr.Zero; this.interopHelper.GetRawInputInfo( rawInputHeader, ref rawInputDeviceHandle, ref keystroke, ref localBuffer); if (this.devices.TryGetValue(rawInputDeviceHandle, out deviceInfo) && keystroke) { handled = true; // 这里判æ–的是Tab按键,å¯ä»¥æ›´æ¢ä¸ºå…¶ä»–按键 if (localBuffer.Length == 1 && (localBuffer[0] == 0x09 || localBuffer[0] == '\t')) { this.FireBarcodeScanned(deviceInfo); } else { this.keystrokeBuffer.Append(localBuffer); } } return handled; } FireBarcodeScanned方法ä¸ï¼Œåˆ™ä¼šè°ƒç”¨ç•Œé¢åˆå§‹åŒ–æ—¶ï¼Œç»‘å®šçš„äº‹ä»¶ï¼Œä¼ å…¥æ‰«ç çš„å—符串 /// <summary> /// è§¦å‘æ‰«ç 事件 /// </summary> /// <param name="deviceInfo">扫ç 设备信æ¯</param> private void FireBarcodeScanned(BarcodeScannerDeviceInfo deviceInfo) { string barcode; EventHandler handler; barcode = this.keystrokeBuffer.ToString(); if (barcode.Length > 0) { handler = this.BarcodeScanned; this.keystrokeBuffer = new StringBuilder(); if (handler != null) { handler(this, new BarcodeScannedEventArgs(barcode, deviceInfo)); } } } 2.页é¢è°ƒç”¨ 这里我使用的MVVM模å¼ï¼Œæ‰€ä»¥åœ¨ViewModel层调用,但是åªè¦èƒ½æ‹¿åˆ°View的对象,在那一层都没有关系 BarcodeScannerListener = new BarcodeScannerListener(); BarcodeScannerListener.Attach((Window)GetView()); BarcodeScannerListener.BarcodeScanned += OnBarcodeScanned; åœ¨ä¼ å…¥çš„äº‹ä»¶ä¸ï¼ŒèŽ·å–Barcode属性å³å¯å¾—到扫æçš„值 private void OnBarcodeScanned(object sender, EventArgs e) { string barcode = ((BarcodeScannedEventArgs)e).Barcode; DoBarcodeScanned(barcode); } 3.é…ç½®æ¡ç 枪的硬件ID 需è¦åœ¨windows设备管ç†å™¨ä¸ï¼Œæ‰¾åˆ°æ‰«ç 枪的设备ID,我这没有图上网找了一个 将这个设备IDä¿å˜åœ¨App.cofigä¸ï¼Œå¯ä»¥æ˜¯å¤šä¸ª <!--在上é¢å…ˆé…置一下--> <configSections> <section name="barcodeScanner" type="Huitai.Cssd.Common.Util.Barcode.BarcodeScannerListenerConfigurationSection, Huitai.Cssd.Common" /> </configSections> <barcodeScanner> <hardwareIds> <add id="HID#VID_05FE&PID_1010" /> </hardwareIds> </barcodeScanner> 最åŽå®žçŽ°çš„æ•ˆæžœè¿˜æ˜¯å分ä¸é”™çš„,åªè¦æ˜¯ç³»ç»Ÿå¤„于å‰å°ï¼ˆä¸å¤ªç¡®å®šå¤„于åŽå°æ˜¯å¦å¥½ç”¨ï¼Œæœ‰ç‚¹è®°ä¸ä½äº†ï¼‰ï¼Œæ¡ç æžªéšæ„扫æï¼Œä¸€çªœæ“作下æ¥ï¼Œæ ¹æœ¬ä¸ç”¨åŠ¨é”®ç›˜æˆ–é¼ æ ‡ï¼Œå› ä¸ºæ‰€æœ‰çš„é é”®ç›˜é¼ æ ‡è§¦å‘的功能,也都是使用特定æ¡ç 定义了,用户体验å分ä¸é”™ã€‚坿ƒœçš„æ˜¯ï¼Œæœ€åŽè¿™ä¸ªç³»ç»Ÿå› ä¸ºå•†åŠ¡åŽŸå› ï¼Œæ²¡æœ‰ä¸Šçº¿ï¼Œè™½ç„¶å®Œæˆåº¦å·²ç»å¾ˆé«˜äº†ï¼Œä½†æ˜¯ä¹ŸåºŸå¼ƒäº†ã€‚...