سؤال

لديّ سلسلة من القيم ، وأريد محاكاة أحداث الضغط على المفاتيح في نافذة لكل حرف.

أخطط للإرسال wm_keydown, WM_CHAR, ، و wm_keyup أحداث إلى النافذة (لأن هذا ما يبدو أنه يتم الضغط على المفتاح يدويًا).

تتطلب هذه الرسائل إرسال int في WPARAM استنادًا إلى جدول من رموز المفاتيح الافتراضية. يمكنني أن أحلق على السلسلة والحصول على كل حرف ، لكن كيف يمكنني أخذ هذا الحرف وتحويله إلى قيمة تتوافق مع رمز المفتاح الظاهري؟ Convert.Toint32 () لا يعمل.

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

المحلول

إرسال WM_Keydown/UP أمر مزعج. يترجم التطبيق نفسه بالفعل رسالة WM_Keydown إلى WM_CHAR ، باستخدام حالة مفاتيح المعدل (Shift ، ALT ، CTRL) وتخطيط لوحة المفاتيح. لا يمكنك التحكم في أي منهما ، ستحصل على الشخصية الخاطئة ، بشكل عشوائي.

ما عليك سوى إرسال رسائل WM_CHAR ، وضبط WPARAM على رمز الحرف. لا داعي للقلق بشأن LPARAM ، القليل من التطبيقات تستخدمه على الإطلاق.

نصائح أخرى

vkkeyscanex أي واحد؟ وفقا ل MSDN IT:

"يترجم حرفًا إلى رمز المفتاح الافتراضي المقابل وحالة التحول."

(يمكنك أيضًا استخدامها vkkeyscan ولكن احذر من أنه تم استبداله بواسطة Vkkeyscanex.)

يبدو أنه يأخذ شخصية ASCII ويحولها إلى Hex. على سبيل المثال ، "A" في Hex هو 41. وفقًا لمخططك ، A IS 0x41 ، وهو صحيح (0x يتفجر Hex).

بشكل عام ، بدلاً من الإرسال WM_KEYDOWN, WM_CHAR و WM_KEYUP الرسائل مباشرة ، يجب استخدامك SendInput (مفضل) أو ربما keybd_event (إهمال).

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

System.Windows.Forms.SendKeys هي فئة WinForms مع طرق ثابتة لمحاكاة إدخال لوحة المفاتيح على النافذة النشطة.

الصيد هو أن .NET ليس لديه طريقة لتركيز Windows في تطبيق آخر ( مستندات Sendkeys تحدث عن كيفية الالتفاف على ذلك).

الحل العام هو استخدام SendMessage وظيفة winapi. هذا الرابط يصف SendMessageتوقيع ويوفر استيراد عينة.

أوه ، إلى رسم خريطة رموز VK يجب استخدامها MapVirtualKey - من الأفضل افتراض أن التعيين تعسفي وليس منطقي.

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