Простое регулярное выражение, которое будет соответствовать, но я бы не рекомендовал для валидации любого типа:
([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}
Обратите внимание, что это соответствует сжатию в любом месте адреса, хотя оно не будет соответствовать адрес обратной связи :: 1. Я считаю это разумным компромиссом, чтобы поддерживать регулярное выражение.
Я успешно использую это в правилах интеллектуального выбора iTerm2 для четырехзвёздных адресов IPv6.
Вы могли использовать Необработанный Входной API для различения клавиатуру и сканер как, я недавно сделал. не имеет значения, сколько клавиатуры или подобных клавиатуре устройств Вы подняли трубку; Вы будете видеть WM_INPUT
, прежде чем нажатие клавиши будет отображено на независящей от устройств виртуальной клавише, которую Вы обычно видите в KeyDown
событие.
Намного легче должен сделать то, что другие рекомендовали и настраивают сканер для отправки символов сигнальной метки прежде и после штрихкода. (Вы обычно делаете это путем сканирования специальных штрихкодов позади руководства пользователя сканера.) Затем Ваша основная форма KeyPreview
событие может наблюдать, что они прокручивают конец и глотают ключевые события для любого дочернего элемента управления, если это посреди чтения штрихкода. Или, если бы Вы хотели быть более необычными, то Вы могли бы использовать захват клавиатуры низкого уровня с SetWindowsHookEx()
, чтобы наблюдать за теми сигнальными метками и глотать их там (преимущество этого - Вы, мог все еще получить событие, даже если бы Ваше приложение не сфокусировалось).
я не мог изменить значения сигнальной метки на наших сканнерах штрихкода среди прочего, таким образом, я должен был пойти сложным путем. Было определенно болезненным. Сохраните это простым, если Вы можете!
-
Ваше обновление, семь лет спустя: , Если Ваш вариант использования читает из сканнера штрихкода USB, Windows 10 имеет хороший, дружественный API для этого встроенного в Windows.Devices.PointOfService.BarcodeScanner
. Это - UWP/WinRT API, но можно использовать его из обычного настольного приложения также; это - то, что я делаю теперь. Вот некоторый пример кода для него, прямо из моего приложения, чтобы дать Вам суть:
{
using System;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using Windows.Devices.Enumeration;
using Windows.Devices.PointOfService;
using Windows.Storage.Streams;
using PosBarcodeScanner = Windows.Devices.PointOfService.BarcodeScanner;
public class BarcodeScanner : IBarcodeScanner, IDisposable
{
private ClaimedBarcodeScanner scanner;
public event EventHandler<BarcodeScannedEventArgs> BarcodeScanned;
~BarcodeScanner()
{
this.Dispose(false);
}
public bool Exists
{
get
{
return this.scanner != null;
}
}
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
public async Task StartAsync()
{
if (this.scanner == null)
{
var collection = await DeviceInformation.FindAllAsync(PosBarcodeScanner.GetDeviceSelector());
if (collection != null && collection.Count > 0)
{
var identity = collection.First().Id;
var device = await PosBarcodeScanner.FromIdAsync(identity);
if (device != null)
{
this.scanner = await device.ClaimScannerAsync();
if (this.scanner != null)
{
this.scanner.IsDecodeDataEnabled = true;
this.scanner.ReleaseDeviceRequested += WhenScannerReleaseDeviceRequested;
this.scanner.DataReceived += WhenScannerDataReceived;
await this.scanner.EnableAsync();
}
}
}
}
}
private void WhenScannerDataReceived(object sender, BarcodeScannerDataReceivedEventArgs args)
{
var data = args.Report.ScanDataLabel;
using (var reader = DataReader.FromBuffer(data))
{
var text = reader.ReadString(data.Length);
var bsea = new BarcodeScannedEventArgs(text);
this.BarcodeScanned?.Invoke(this, bsea);
}
}
private void WhenScannerReleaseDeviceRequested(object sender, ClaimedBarcodeScanner args)
{
args.RetainDevice();
}
private void Dispose(bool disposing)
{
if (disposing)
{
this.scanner = null;
}
}
}
}
Предоставленный, Вам будет нужен сканнер штрихкода, который поддерживает HID USB НА МЕСТЕ ПРОДАЖИ и не является просто клином клавиатуры. Если Ваш сканер является просто клином клавиатуры, я рекомендую взять что-то как используемый Honeywell 4600G от eBay за подобные 25$. Доверяйте мне, Ваша исправность будет стоить того.
То, что я сделал в аналогичной ситуации, различают сканирование и пользователя, вводящего путем рассмотрения скорости входа.
Партии символов очень близко друг к другу тогда пауза является сканированием. Что-либо еще - ввод с клавиатуры.
я не знаю точно Ваших требований, поэтому, возможно, так не пойдет для Вас, но лучше, чтобы я имел:)
Это зависит от способа, которым Вы взаимодействуете с устройством. Так или иначе это привычка быть решением C#, это будет некоторая другая библиотека. Вы считываете данные с потока? Если Вы просто берете нажатия клавиш, не может быть ничего, что можно делать с этим.
Я думаю, что Вы могли бы быть в состоянии отличить несколько клавиатур через API DirectX, или если это не работает через необработанный входной API.