Я разрабатываю приложение для магазина одежды для печати счетов-фактур в этом приложении. Я хочу использовать сканер штрих-кода для автоматического сбора информации из тега элемента, содержащей штрих-код, и автоматически заполнять всю информацию в моя форма, и после этого я распечатываю счет-фактуру. Просьба дать некоторые рекомендации по работе с этой проблемой. Я также использую библиотеку Microsoft.PointOfService.Работа со сканером штрих-кода в приложении Windows C#
ответ
Обычно сканер штрих-кода просто отправляет все распознанные символы в качестве стандартного ввода на клавиатуре. Таким образом, когда пользователь настраивает фокус на текстовое поле в вашем приложении и сканирует штрих-код, он будет таким же, как если бы пользователь просто ввел символы штрих-кода вручную и нажал «Enter» (или любой другой ключ, в зависимости от настроек сканера).
Предположим, у вас есть текстовое поле в форме, когда штрих-код сканирует, он набирает символы штрих-кода в текстовом поле. Как правило, некоторые сканеры могут быть настроены для добавления другого символа в конце сканирования, чаще всего нового символа линии. При этом вы можете прослушивать событие KeyPress текстового поля и обрабатывать символ New Line. Когда это срабатывает, вы можете получить другие детали в форме.
спасибо за ваш ответ –
У меня есть класс в моей личной библиотеке, чтобы обнаружить сканер работает:
public sealed class ScanReader
{
#region Delegates
public delegate void _DataLoaded(string ScannedData);
#endregion
private readonly double MyMaxMillisecondsBetweenPress;
private readonly List<Regex> MyRegex;
private readonly Timer TimeToNextKeyPress = new Timer();
private string CardBuff = string.Empty;
private bool FirstKeyPress = true;
private DateTime Stamp;
/// <summary>
/// ScanReader constructor
/// </summary>
/// <param name="Press"> Form where KeyPreview = true </param>
/// <param name="Regs"> Regular expressions for filtering scanned data</param>
/// <param name="MaxMillisecondsBetweenPress"> The maximum time between pressing the keys in milliseconds, default = 60 </param>
public ScanReader(Form form, List<Regex> Regs = null, double MaxMillisecondsBetweenPress = 0)
{
MyRegex = Regs ?? null;
MyMaxMillisecondsBetweenPress = MaxMillisecondsBetweenPress == 0 ? 60 : MaxMillisecondsBetweenPress;
form.KeyPress += KeyPressed;
TimeToNextKeyPress.Interval =
Convert.ToInt32(MyMaxMillisecondsBetweenPress + MyMaxMillisecondsBetweenPress*0.2);
TimeToNextKeyPress.Tick += TimeToNextKeyPress_Tick;
}
public event _DataLoaded OnDataLoaded;
private void TimeToNextKeyPress_Tick(object sender, EventArgs e)
{
TimeToNextKeyPress.Stop();
if (MyRegex.Count > 0)
{
foreach (Regex reg in MyRegex)
{
if (reg.IsMatch(CardBuff))
{
OnDataLoaded(CardBuff);
return;
}
}
}
else
OnDataLoaded(CardBuff);
}
private void KeyPressed(object sender, KeyPressEventArgs e)
{
if (FirstKeyPress)
{
Stamp = DateTime.Now;
FirstKeyPress = false;
CardBuff = e.KeyChar.ToString();
}
else
{
if ((DateTime.Now - Stamp).TotalMilliseconds < MyMaxMillisecondsBetweenPress)
{
Stamp = DateTime.Now;
CardBuff += e.KeyChar;
}
else
{
Stamp = DateTime.Now;
CardBuff = e.KeyChar.ToString();
}
}
TimeToNextKeyPress.Stop();
TimeToNextKeyPress.Start();
}
}
Как использовать:
var myReader = new ScanReader(this, new List<Regex>
{
new Regex(@"296\d{13,13}"),
new Regex(@"K%.{5,34}"),
new Regex(@"C%.{5,34}"),
new Regex(@"E%.{5,34}"),
});
myReader.OnDataLoaded += FillControls;
@ Alex Киселёв Спасибо за ваш ответ .. –