Как различать несколько устройств ввода данных в C#

Простое регулярное выражение, которое будет соответствовать, но я бы не рекомендовал для валидации любого типа:

([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}

Обратите внимание, что это соответствует сжатию в любом месте адреса, хотя оно не будет соответствовать адрес обратной связи :: 1. Я считаю это разумным компромиссом, чтобы поддерживать регулярное выражение.

Я успешно использую это в правилах интеллектуального выбора iTerm2 для четырехзвёздных адресов IPv6.

22
задан Amar Patel 5 March 2009 в 01:59
поделиться

4 ответа

Вы могли использовать Необработанный Входной 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$. Доверяйте мне, Ваша исправность будет стоить того.

17
ответ дан 29 November 2019 в 05:36
поделиться

То, что я сделал в аналогичной ситуации, различают сканирование и пользователя, вводящего путем рассмотрения скорости входа.

Партии символов очень близко друг к другу тогда пауза является сканированием. Что-либо еще - ввод с клавиатуры.

я не знаю точно Ваших требований, поэтому, возможно, так не пойдет для Вас, но лучше, чтобы я имел:)

3
ответ дан 29 November 2019 в 05:36
поделиться

Это зависит от способа, которым Вы взаимодействуете с устройством. Так или иначе это привычка быть решением C#, это будет некоторая другая библиотека. Вы считываете данные с потока? Если Вы просто берете нажатия клавиш, не может быть ничего, что можно делать с этим.

1
ответ дан 29 November 2019 в 05:36
поделиться

Я думаю, что Вы могли бы быть в состоянии отличить несколько клавиатур через API DirectX, или если это не работает через необработанный входной API.

0
ответ дан 29 November 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: