كيفية التمييز بين أجهزة الإدخال المتعددة في C #

StackOverflow https://stackoverflow.com/questions/587840

  •  06-09-2019
  •  | 
  •  

سؤال

لدي ماسح الباركود (الذي يعمل مثل لوحة مفاتيح) وبالطبع لدي لوحة مفاتيح مدمن مختصرة جدا حتى جهاز كمبيوتر. البرنامج يقبل الإدخال من كل من الماسح الضوئي ولوحة المفاتيح. أحتاج إلى قبول إدخال الماسح الضوئي فقط. الرمز مكتوب في C #. هل هناك طريقة "تعطيل" المدخلات من لوحة المفاتيح وقبول المدخلات فقط من الماسح الضوئي؟

ملاحظة: لوحة المفاتيح هي جزء من أجهزة الكمبيوتر المحمول ... لذلك لا يمكن فصلها. أيضا، حاولت وضع التعليمة البرمجية المحمية في العمليات المنطقية المحمية (SYSTEM.WINDOWS.FORMS.KEYYS KEYDATA) {إرجاع True؛ } ولكن بعد ذلك مع تجاهل ضغطات المفاتيح من لوحة المفاتيح، يتم تجاهل إدخال ماسح الباركود أيضا.

لا أستطيع أن أحصل على الماسح الضوئي، أرسل أحرفا قويا كما، يتم استخدام الماسح الضوئي من قبل التطبيقات الأخرى وإضافة دفق حرف Slineal يعني تعديل التعليمات البرمجية الأخرى.

أيضا، لا يمكنني استخدام طريقة توقيت تحديد ما إذا كانت المدخلات جاءت من ماسح الباركود (إذا كانت مجموعة من الأحرف متبوعة بتوقف مؤقتا) نظرا لأن الباركود ممسوحة ضوئيا يمكن أن تكون بطاريات حرف واحد.

نعم، أنا أقرأ البيانات من دفق.

أحاول متابعة المقالة: تمييز ماسحات الباركود من لوحة المفاتيح في WinForms. ومع ذلك، لدي الأسئلة التالية:

  1. أحصل على خطأ NativeMethods غير قابل للوصول بسبب مستوى الحماية. يبدو كما لو أنني بحاجة لاستيراد DLL؛ هل هذا صحيح؟ ان كان هاكذا كيف افعلها؟
  2. أي تعريف محمي باطلة WNDPROC (REF Message M) تعريف يجب أن أستخدمه، وهناك تطبيقان في المقال؟
  3. أنا أحصل على خطأ مرتبط [SecurityPermission (Security.linkdemand، Flags = SecurityPermissionFlag.unagedCode)] خطأ CS0246: تعذر العثور على اسم النوع أو اسم الاسم "SecurityPermission" (هل تفتقد استخدام التوجيه أو مرجع التجميع؟). كيف يمكنني حل هذا الخطأ؟
  4. يوجد أيضا خطأ في الخط الذي يحتوي على: إذا ((من HardwareID في الأجهزة المصنوعة حيث DeviceName.Contains (HardwareID) حدد HardwareID) .Count ()> 0) الخطأ هو الخطأ CS1026 :) المتوقع.
  5. يجب أن أضع كل الكود في المقالة في ملف .cs واحد يسمى barcodescannerlistener.cs؟

أسئلة متابعة حول C # Solution Source Code تم إرسالها بواسطة Nicholas Piasecki ON http://nicholas.piasecki.name/blog/2009/02/Distinguishing-Barcode-Scanners-From-thebled-in-winforms/:

  1. لم أتمكن من فتح الحل في VS 2005، لذلك قمت بتنزيل إصدار Visual C # 2008 Express Edition، وركض الرمز. ومع ذلك، بعد تثبيت ماسحة الباركود الخاصة بي ومسح الباركود، لم يتعرف البرنامج على المسح الضوئي. أضع نقطة انقطاع في طريقة OnBacRaDescanned لكنها لم تصل أبدا. قمت بتغيير App.config مع معرف ماسح الباركود الخاص بي الذي تم الحصول عليه باستخدام إدارة الأجهزة. يبدو أنه سيكون هناك اسم 2 DeviceNames مع HID # VID_0536 و PID_01C1 (الذي يتم الحصول عليه من إدارة الأجهزة عندما يكون الماسح الضوئي مدمن مخدرات). لا أعرف ما إذا كان هذا يسبب المسح ألا يعمل. عند التكرار فوق DeviceNames، إليك قائمة الأجهزة التي وجدتها (باستخدام المصحح):

" ؟؟ hid # vid_0536 و pid_01c1 & mi_01 # 9 & 25CA5370 و 0 & 0000 # {4D1E55B2-F16F-11CF-88CB-001111000030}

" ؟؟ hid # vid_0536 & pid_01c1 & mi_00 # 9 & 38E10B9 & 0 & 0000 # {884B96C3-56EF-11D1-BC8C-00A0C91405DD}"

" ؟؟ hid # vid_413c & pid_2101 & mi_00 # 8 & 1966E83D & 0 & 0000 # {884B96C3-56EF-11D1-BC8C-00A0C91405DD}"

" ؟؟ hid # vid_413c & pid_3012 # 7 & 960FAE0 & 0 & 0000 # {378DE44C-56EF-11D1-BC8C-00A0C91405DD}"
" ؟؟ Root # RDP_KBD # 0000 # {884B96C3-56EF-11D1-BC8C-00A0C91405DD}" ؟؟ ACPI # PNP0303 # 4 & 2F94427B & 0 # {884B96C3-56EF-11D1-BC8C-00A0C91405DD} " ؟؟؟ Root # RDP_MOU # 0000 # {378DE44C-56EF-11D1-BC8C-00A0C91405DD} " ؟؟ ACPI # PNP0F13 # 4 & 2F94427B & 0 # {378DE44C-56EF-11D1-BC8C-00A0C91405DD}"

لذلك هناك 2 مقالات ل HID # Vid_0536 و PID_01C1؛ هل يمكن أن يسبب المسح الضوئي لعدم العمل؟

حسنا، يبدو أنني اضطررت إلى معرفة طريقة عدم الاعتماد على حرف ASCII 0x04 الذي يتم إرساله بواسطة الماسح الضوئي ... نظرا لأن My Scanner لا يرسل هذه الحرف. بعد ذلك، يتم إطلاق الحدث الممسوح ضوئيا الباركود ويتم عرض المنبثقة مع الباركود. حتى شكرا نيكولاس لمساعدتكم.

هل كانت مفيدة؟

المحلول

يمكنك استخدام API الإدخال الخام للتمييز بين لوحة المفاتيح والماسح الضوئي كما فعلت مؤخرا. لا يهم عدد أجهزة لوحة المفاتيح أو لوحة المفاتيح التي قمت بإدخالها؛ سوف ترى WM_INPUT قبل تعيين ضغط المفاتيح إلى مفتاح افتراضي مستقل للجهاز ترى عادة في KeyDown حدث.

من الأسهل بكثير هو القيام بما أوصى به الآخرون وتكوين الماسح الضوئي لإرسال أحرف Sentinel قبل وبعد الباركود. (عادة ما تفعل ذلك عن طريق مسح الباركود الخاص في الجزء الخلفي من دليل المستخدم الماسح الضوئي.) ثم، النموذج الرئيسي الخاص بك KeyPreview يمكن للحدث مشاهدة تلك الإنهاء لفة وابتلاع الأحداث الرئيسية لأي تحكم في الطفل إذا كان ذلك في منتصف قراءة الباركود. أو، إذا كنت ترغب في أن تكون مراغبا، فيمكنك استخدام خطاف لوحة مفاتيح منخفضة المستوى مع SetWindowsHookEx() لمشاهدة هؤلاء الحكمين وابتلاعهم هناك (ميزة هذا، هل لا يزال بإمكانك الحصول على الحدث حتى لو لم يكن تطبيقك التركيز).

لم أستطع تغيير قيم Sentinel على ماسحات الباركود لدينا من بين أشياء أخرى، لذلك اضطررت إلى الذهاب إلى الطريق المعقد. كان بالتأكيد مؤلمة. احتفظ بها بسيطة إذا استطعت!

--

التحديث الخاص بك، بعد سبع سنوات: إذا كانت حالة استخدامك هي قراءة من ماسح الباركود USB، فإن Windows 10 لديه API لطيفة وودية لهذا المدمج في Windows.Devices.PointOfService.BarcodeScanner. وبعد إنها API UWP / WinRT، ولكن يمكنك استخدامه من تطبيق سطح المكتب العادي أيضا؛ هذا ما أقوم به الآن. إليك بعض المثال مثالا لذلك، مباشرة من تطبيقي، لإعطائك GIST:

{
    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;
            }
        }
    }
}

منحت، ستحتاج إلى ماسحة الباركود يدعم USB HID POS وليس مجرد إسفين لوحة مفاتيح. إذا كان الماسح الضوئي الخاص بك هو مجرد إسفين لوحة مفاتيح، أوصي بالتقاط شيء مثل Honeywell 4600g المستخدمة من eBay لمثل 25 دولارا. ثق بي، سيكون عقلك يستحق كل هذا العناء.

نصائح أخرى

ما فعلته في وضع مماثل يميز بين المسح وكتابة مستخدم من خلال النظر إلى سرعة المدخلات.

الكثير من الشخصيات قريبة جدا معا ثم توقف مؤقت. أي شيء آخر هو إدخال لوحة المفاتيح.

أنا لا أعرف بالضبط متطلباتك، لذلك ربما لن تفعل ذلك من أجلك، لكنها أفضل ما لدي :)

ذلك يعتمد على الطريقة التي تتفاعل بها مع الجهاز. على أي حال، لن يكون حل C #، سيكون هناك مكتبة أخرى. هل تقرأ البيانات من دفق؟ إذا كنت مجرد أخذ ضغطات المفاتيح، فقد لا يوجد شيء يمكنك القيام به حيال ذلك.

أعرف أن هذا هو موضوع قديم، وجدته عن طريق البحث في مسح الباركود في Win10. مجرد عدد قليل من الملاحظات في حالة يحتاج شخص ما.

تحتوي هذه الماسحات الضوئية من Honeywell على العديد من واجهات USB. واحد هو لوحة مفاتيح + نقطة اختبأ في المبيعات (الجهاز المركب). أيضا هناك CDC-ACM (مضاهاة COMPREPT) ونقطة HID في المبيعات (وحدها) + أكثر.

بشكل افتراضي، تعرض الماسحات ضوئيا رقما تسلسلا، لذلك يمكن للمضيف التمييز بين العديد من الأجهزة (كان لدي مرة واحدة +20 متصلة). هناك أمر لتعطيل الرقم التسلسلي رغم ذلك!

النماذج الأحدث تتصرف بنفس الشيء في هذا الصدد. إذا كنت تريد أن ترى أنه يعيش، فجرب برنامج المحيط الخاص بي Yat3 (مجانا على موقعي). يمكن أن يفتح جميع الواجهات المذكورة أعلاه ومصممة خصيصا لهذه الأجهزة.

كلمة لاستخدام واجهات لوحة المفاتيح:
استخدمها فقط كملاذ أخير. إنها بطيئة وأقل موثوقية عندما يتعلق الأمر بشخصيات غريبة. الاستخدام الجيد الوحيد هو إذا كنت ترغب في إدخال البيانات في التطبيقات الموجودة. إذا كنت رمز على أي حال، فإن القراءة من COMPOR / HIMPOS -THERE هي أسهل.

انظروا الى هذا: http://nate.dynalias.net/dev/keyboardredirector.Rails. (لا يعد متوفرا) يعمل عظيم!

حدد لوحة المفاتيح والمفاتيح التي تريد حظرها، ويعمل مثل سحر!

ألق نظرة على هذا: http://www.oblita.com/interception.html. يمكنك إنشاء مجمع C # لذلك - كما يعمل مثل سحر ..

أعتقد أنك قد تكون قادرا على التمييز بين لوحات المفاتيح المتعددة من خلال DirectX API، أو إذا لم ينجح ذلك، من خلال API الإدخال الخام.

لقد نجحت بنجاح ما تبحث عنه الناس هنا. لدي تطبيق يتلقى جميع بيانات أحرف الباركود من ماسح الباركود الباركود في هانيويل / ماسرولوجي. لا يتلقى تطبيق آخر على النظام البيانات من الماسح الضوئي، وتستمر لوحة المفاتيح في العمل بشكل طبيعي.

يستخدم تطبيقي مجموعة من الإدخال الخام ونظام هوك لوحة المفاتيح المنخفضة المستوى المروع. على عكس ما هو مكتوب هنا، وجدت أن رسالة WM_INPUT تم استلامها قبل استدعاء وظيفة ربط لوحة المفاتيح. يعين التعليمات البرمجية الخاصة بي لمعالجة رسالة WM_INPOLY أساسا متغيرا منطما لتحديد ما إذا كانت الحرف المستلم من الماسح الضوئي أم لا. تتم معالجة وظيفة هوك لوحة المفاتيح، التي تم استدعاؤها مباشرة بعد معالجة WM_INPUT، وتبناض بيانات لوحة المفاتيح الزائفة في الماسح الضوئي، مما يمنع البيانات الواردة من التطبيقات الأخرى.

يجب وضع وظيفة Hook لوحة المفاتيح في DLL لأنك ترغب في اعتراض جميع رسائل لوحة مفاتيح النظام. أيضا، يجب استخدام ملف معين للذاكرة لرمز معالجة WM_Input للتواصل مع DLL.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top