خطاف لوحة المفاتيح العالمي عالي المستوى لـ C# و WPF لقراءة ماسح ضوئي بطاقة إسفين لوحة المفاتيح
-
22-09-2019 - |
سؤال
خطاف لوحة المفاتيح الوحيد المدعوم للرمز المدير .NET هو خطاف لوحة مفاتيح منخفض المستوى (WH_KEYBOARD_LL).
يرى باستخدام خطاف لوحة المفاتيح العالمي (wh_keyboard_ll) في wpf / c#
لديّ الرمز أعلاه يعمل في طلبي في الوقت الحالي ، بحيث عند انتزاع بطاقتك ، ستحصل على قائمة بجميع ضربات المفاتيح. تكمن المشكلة في كتابة أحرف محدد مثل "٪" و "؛" ؛ سوف يرسل لي alt+numpad+؟ كائنات مفتاح WPF المقابلة لهذه الرموز.
سؤالي: هل هناك طريقة ما لجعل هذا التصرف أكثر رفيعة المستوى ، أي لالتقاط سلسلة تم إنشاؤها من جميع أوامر لوحة المفاتيح؟
هتافات!
المحلول
لست متأكدًا مما يحدث ، ولكن الحصول على شخصية مثل ٪ من خطاف لوحة المفاتيح أمر غير محفور للغاية. يعلمك الخطاف فقط من المفاتيح الافتراضية. ولكن ٪ هو مفتاح كتابة ، يتم إنتاجه عن طريق الضغط على Shift + 5 على لوحة المفاتيح الخاصة بي (تخطيط أمريكي). ينتج Windows هذه الأحرف عادة عن طريق معالجة الرسائل WM_Keydown/UP ، وإنشاء رسالة WM_CHAR لمفتاح الكتابة. هذا لا يحدث في قضيتك. وظيفة Windows ذات المستوى المنخفض التي تقوم بذلك هي tounicodeex ().
نصائح أخرى
أعتقد أنه إذا كنت تقوم بتمرير البطاقة ، فهناك إدخال في مكان ما على نموذج WPF ، مثل مربع النص على سبيل المثال؟ بعد ذلك ، سأميل إلى إضافة حدث ، وربما معالج حدث Keyup ، (يقوم ماسح ضوئي بمسافة لوحة المفاتيح بإرسال إشارة نهاية المعالجة مثل Enter للإشارة إلى أن التمرير كان ناجحًا نعم؟) ، في معالج حدث Keyup ، قم ببناء سلسلة باستخدام StringBuilder ، وعندما يتم اكتشاف إشارة نهاية المعالجة مثل Enter ، يمكنك بعد ذلك إزالة "٪" و "؛" ؛ من مثيل StringBuilder وافعل كل ما لديك علاقة به.
قد يكون من الأسهل استخدام نظام الحالة ، عندما يتلقى معالج أحداث Keyup "٪" ، ثم أدخل حالة أخرى حيث تكون الحالة المتوقعة "؛" ؛
static bool StartState = false; StringBuilder sbInput = new StringBuilder(); private void textBox1_KeyUp(object sender, KeyEventArgs e) { if (!StartState){ if (e.KeyCode == Keys.D5) StartState = true; sbInput.Append((char)e.KeyValue); }else{ if (e.KeyCode == Keys.OemSemicolon){ StartState = false; // sbInput will contain the data from the scanner, // copy it somewhere else and reset sbInput // sbInput.Remove(0, sbInput.Length); } sbInput.Append((char)e.KeyValue); } e.Handled = true; }
أتمنى أن يساعد هذا ، مع أطيب التحيات ، توم.