خطاف لوحة المفاتيح العالمي عالي المستوى لـ C# و WPF لقراءة ماسح ضوئي بطاقة إسفين لوحة المفاتيح

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

سؤال

خطاف لوحة المفاتيح الوحيد المدعوم للرمز المدير .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;
}

أتمنى أن يساعد هذا ، مع أطيب التحيات ، توم.

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