摩托罗拉的MC3100的扫描读取条形码功能做的比较呆瓜。没有现在其他读取条形码PDA方便。MC3100的扫描读取条形码功能居然要自己调用官方的dll。之后把扫描结果保存在textbox或者txt等等中。代码如下:
需要引用:
using Symbol.Barcode;
using Symbol;
核心代码:
/// <summary>
/// 定义一个读取器
/// </summary>
public Reader MyReader { get; set; }
/// <summary>
/// 定义一个存储读取数据的介质
/// </summary>
public ReaderData MyReaderData { get; set; }
/// <summary>
/// 定义委托
/// </summary>
public EventHandler MyEventHandler { get; set; }
/// <summary>
/// 获取到信息不需要通知
/// </summary>
public bool IsReadNotificationAttached { get; set; }
/// <summary>
/// 定义消息
/// </summary>
public string Message { get; set; }
public delegate void UpdateUiDelegate();
/// <summary>
/// 扫描并把数据保存到textbox
/// </summary>
private void Scanning()
{
if (InitReader())
{
StartRead();
}
else
{
base.Close();
}
}
/// <summary>
/// 初始化扫描器
/// </summary>
/// <returns></returns>
private bool InitReader()
{
if (this.MyReader != null)
{
return false;
}
try
{
if (Symbol.Barcode.Device.AvailableDevices.Length <= 1)
{
this.MyReader = new Symbol.Barcode.Reader();
}
this.MyReaderData = new ReaderData(ReaderDataTypes.Text, ReaderDataLengths.MaximumLabel);
this.MyEventHandler = new EventHandler(this.MyReader_ReadNotify);
this.MyReader.Actions.Enable();
this.MyReader.Parameters.Feedback.Success.BeepTime = 0;
this.MyReader.Parameters.Feedback.Success.WaveFile = @"\windows\alarm3.wav";
base.Activated += new EventHandler(this.ReaderFormActivated);
base.Deactivate += new EventHandler(this.ReaderFormDeactivate);
return true;
}
catch (Exception ex)
{
//这里需要记录日志
Message = "InitReader方法出现问题:" + ex.Message;
return false;
}
}
/// <summary>
/// 委托读取数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MyReader_ReadNotify(object sender, EventArgs e)
{
var TheReaderData = this.MyReader.GetNextReaderData();
if (TheReaderData.Result == Results.SUCCESS)
{
this.HandleData(TheReaderData);
this.StartRead();
}
else
{
string sMsg = "Read Failed\nResult = " + TheReaderData.Result.ToString();
this.Message = sMsg;
if (TheReaderData.Result == Results.E_SCN_READINCOMPATIBLE)
{
sMsg = "The application will now exit.";
this.Message = sMsg;
base.Close();
}
}
}
/// <summary>
/// 根据保存器中的数据循环赋值给textbox
/// </summary>
/// <param name="theReaderData"></param>
private void HandleData(Symbol.Barcode.ReaderData theReaderData)
{
foreach (Control c in base.Controls)
{
if ((c is TextBox) && c.Focused)
{
var tb = (TextBox)c;
tb.Text = theReaderData.Text;
base.SelectNextControl(tb, true, true, true, true);
}
}
}
/// <summary>
/// 开始扫描
/// </summary>
private void StartRead()
{
if ((this.MyReader != null) && (this.MyReaderData != null))
{
try
{
if (!this.IsReadNotificationAttached)
{
this.MyReader.ReadNotify += this.MyEventHandler;
this.IsReadNotificationAttached = true;
}
this.MyReader.Actions.Read(this.MyReaderData);
}
catch(Exception ex)
{
//这里需要记录日志
Message = "StartRead方法出错:" + ex.Message;
}
}
}
private void ReaderFormActivated(object sender, EventArgs e)
{
if (!this.MyReaderData.IsPending)
{
this.StartRead();
}
}
/// <summary>
/// 扫描窗体
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ReaderFormDeactivate(object sender, EventArgs e)
{
this.StopRead();
}
/// <summary>
/// 停止扫描
/// </summary>
private void StopRead()
{
if (this.MyReader != null)
{
try
{
if (this.IsReadNotificationAttached)
{
this.MyReader.ReadNotify -= this.MyEventHandler;
this.IsReadNotificationAttached = false;
}
this.MyReader.Actions.Flush();
}
catch(Exception ex)
{
Message = "StopRead方法出错,出错信息是:" + ex.Message;
}
}
}
在调用的时候只需要用到:
/// <summary>
/// 加载扫描
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SendProduct_Load(object sender, EventArgs e)
{
txtExpress.Text = FormBase.ExpressName;
txtOrderId.Focus();
Scanning();
}
完事