在上一家公司创业初期,我接触的第一个项目是医院的供应室消毒包管理系统,几乎一人之力用了两个多月的时间,完成了基本的开发工作。回想起来,当时有个设计印象深刻。趁着还有记忆,记录下来,供大家一时之需。
当时开发的时候,对于物资的管理,自然离不开条码枪的角色。设计的是无线条码枪,让工作人员可以自由的在作业现场走动。但是有个用户体验问题,就是一般情况下,条码枪扫描的时候,都需要将输入焦点放到文本框之中,这个限制会造成极为不好的用户体验。此外,在流程设计的时候,实际上一系列操作动作,是使用扫描不同命令条码后,实现的。比如启动某功能,扫码后,确定继续下一个动作等等,全程不用碰PC机。
所以问题的核心就在于是否可以接触焦点必须放到文本框之中的限制。
此方法并不是原创,但是原始代码是对WinForm平台进行开发的,被我修改为支持WPF平台。并且原文的链接已经失效,所以这段代码还是很有价值的。
现在放出几个关键点的代码,加以说明,全部代码在最后放出链接:
1.扫描监听器BarcodeScannerListener
使用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);
}
/// <