كيفية محاكاة إدخال لوحة المفاتيح لجلسة سطح المكتب البعيد؟

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

سؤال

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

Byte key = Ord("A");

keybd_event(key, 0, 0, 0); // key goes down
keybd_event(key, 0, KEYEVENTF_KEYUP, 0); // key goes up

يقوم هذا الرمز الآن بإرسال الحرف "a" إلى أي نافذة محلية، لكنه لن يتم إرساله إلى نافذة سطح المكتب البعيد.

ما يعنيه ذلك هو أنني أستخدم Remote Desktop للاتصال بالخادم، ثم أفتح برنامج "المفكرة" على ذلك الخادم.إذا قمت بالضغط على المفاتيح يدويًا على لوحة المفاتيح:تظهر في نافذة محرر المفكرة.لكن إدخال لوحة المفاتيح المزيفة لـ keybd_event لا يتسبب في ظهور الحرف "a" في "المفكرة".

كيف يمكنني إرسال إدخال لوحة مفاتيح زائف برمجيًا إلى تطبيق يعمل داخل اتصال سطح مكتب بعيد، من تطبيق يعمل على الجهاز المحلي؟


ركن نيتبيكرز

في هذه الحالة بالذات أريد أن أفعل هذا لأنني أحاول التغلب على مهلة الخمول.ولكن يمكنني أيضًا أن أحاول ذلك

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

بمعنى آخر، أسباب رغبتي في ذلك ليست مهمة

ملحوظة: قد تكون المهلة ناجمة عن عدم نشاط سطح المكتب البعيد، أو ربما لا.لا أعرف، ولا يؤثر ذلك على سؤالي.

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

المحلول

إجابة

على الرغم من أن Microsft تقول أنك لست بحاجة إلى ذلك، ولا ينبغي لك, ، أرسل رمز OEM، تحتاج إلى إرسال رموز مسح OEM.في هذا المثال، أحتاج إلى إرسال رموز فحص OEM لـ

  • المفتاح A ينخفض
  • المفتاح A يرتفع

هناك صورة لمخطط على CodeProject يسرد رموز الفحص والكسر لمفاتيح مختلفة:

alt text

في حالتي، يجب تغيير الاستدعاءات الأصلية لـ keybd_event إلى:

Byte key = Ord("A");

keybd_event(key, 0x1E, 0, 0); // key goes down
keybd_event(key, 0x9E, KEYEVENTF_KEYUP, 0); // key goes up

لقد اختبرت هذا، ويعمل.لذلك كل شيء على ما يرام.

نصائح أخرى

ربما يمكنك تنفيذ com.autoit البرنامج النصي مع بسيكسيك, ، بديل telnet خفيف الوزن يتيح لك تنفيذ العمليات على أنظمة أخرى، مع استكمال التفاعل الكامل لتطبيقات وحدة التحكم، دون الحاجة إلى تثبيت برنامج العميل يدويًا.

(AutoIt قادر تمامًا على إرسال أي إشارة (مفاتيح أو غيرها) إلى أي تطبيق نافذة، ويمكن تشغيله باستخدام PsExec على سطح المكتب البعيد)

برنامج نصي AutoIt مثل KillSaver, ، على سبيل المثال، تم تصميمه لتحريك الماوس لتجنب إطالة وقت الخمول على جهاز الكمبيوتر!

هذا يعمل بشكل جيد جدا شكرا لك.للحصول على رمز فحص لوحة المفاتيح، يمكن استخدام ما يلي:

int scan;
scan = MapVirtualKey(key & 0xff, 0);
keybd_event(key, scan, 0, 0); // key goes down
keybd_event(key, scan | 0x80, KEYEVENTF_KEYUP, 0); // key goes up

يمكنك استخدام SendMessage();إنها حقًا محاكاة أفضل بكثير للمفاتيح.حسنا، حظا سعيدا في هذا!

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