《条码枪的无焦点扫码源码》
基本信息
打开支付宝首页搜“673273051”领红包,领到大红包的小伙伴赶紧使用哦!
相关书籍
- 《unity入门教程视频-免费下载》[]
- 《Object Oriented Analysis And Design With Applications》[]
- 《Kafka源码解析与实战》[]
- 《APDL参数化有限元分析技术及其应用实例-ansys-免费下载》[]
- 《ANSYS操作命令与参数化编程-免费下载》[]
- 《新编WindowsAPI参考大全-pdf-免费下载》[]
- 《MATLAB 7.0 基础教程-免费下载》[]
- 《MATLAB应用程序接口用户指南-免费下载》[]
- 《信号分析与处理_MATLAB语言及应用-免费下载》[]
- 《信号分析与处理——MATLAB语言及应用-免费下载》[]
内容介绍
Barcode[www.minxue.net].zip
在上一家公å¸åˆ›ä¸šåˆæœŸï¼Œæˆ‘接触的第一个项目是医院的供应室消毒包管ç†ç³»ç»Ÿï¼Œå‡ 乎一人之力用了两个多月的时间,完æˆäº†åŸºæœ¬çš„å¼€å‘工作。回想起æ¥ï¼Œå½“时有个设计å°è±¡æ·±åˆ»ã€‚è¶ç€è¿˜æœ‰è®°å¿†ï¼Œè®°å½•下æ¥ï¼Œä¾›å¤§å®¶ä¸€æ—¶ä¹‹éœ€ã€‚
当时开å‘的时候,对于物资的管ç†ï¼Œè‡ªç„¶ç¦»ä¸å¼€æ¡ç æžªçš„è§’è‰²ã€‚è®¾è®¡çš„æ˜¯æ— çº¿æ¡ç 枪,让工作人员å¯ä»¥è‡ªç”±çš„在作业现场走动。但是有个用户体验问题,就是一般情况下,æ¡ç 枪扫æçš„æ—¶å€™ï¼Œéƒ½éœ€è¦å°†è¾“入焦点放到文本框之ä¸ï¼Œè¿™ä¸ªé™åˆ¶ä¼šé€ æˆæžä¸ºä¸å¥½çš„用户体验。æ¤å¤–,在æµç¨‹è®¾è®¡çš„æ—¶å€™ï¼Œå®žé™…上一系列æ“作动作,是使用扫æä¸åŒå‘½ä»¤æ¡ç åŽï¼Œå®žçŽ°çš„ã€‚æ¯”å¦‚å¯åЍæŸåŠŸèƒ½ï¼Œæ‰«ç åŽï¼Œç¡®å®šç»§ç»ä¸‹ä¸€ä¸ªåŠ¨ä½œç‰ç‰ï¼Œå…¨ç¨‹ä¸ç”¨ç¢°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>
最åŽå®žçŽ°çš„æ•ˆæžœè¿˜æ˜¯å分ä¸é”™çš„,åªè¦æ˜¯ç³»ç»Ÿå¤„于å‰å°ï¼ˆä¸å¤ªç¡®å®šå¤„于åŽå°æ˜¯å¦å¥½ç”¨ï¼Œæœ‰ç‚¹è®°ä¸ä½äº†ï¼‰ï¼Œæ¡ç æžªéšæ„扫æï¼Œä¸€çªœæ“作下æ¥ï¼Œæ ¹æœ¬ä¸ç”¨åŠ¨é”®ç›˜æˆ–é¼ æ ‡ï¼Œå› ä¸ºæ‰€æœ‰çš„é é”®ç›˜é¼ æ ‡è§¦å‘的功能,也都是使用特定æ¡ç 定义了,用户体验å分ä¸é”™ã€‚坿ƒœçš„æ˜¯ï¼Œæœ€åŽè¿™ä¸ªç³»ç»Ÿå› ä¸ºå•†åŠ¡åŽŸå› ï¼Œæ²¡æœ‰ä¸Šçº¿ï¼Œè™½ç„¶å®Œæˆåº¦å·²ç»å¾ˆé«˜äº†ï¼Œä½†æ˜¯ä¹ŸåºŸå¼ƒäº†ã€‚
