سؤال

خلفية

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

Microsoft Remoteapp يسمح للمستخدمين بالاتصال بالتطبيقات من خلال بروتوكول RDP ، ولكن بدلاً من إظهار الجهاز الظاهري البعيد بأكمله ، فإنه يعرض نافذة التطبيق فقط. إلى المستخدم النهائي ، لا يوجد فرق بين تطبيق يعمل ضمن RemoteApp ويعمل على سطح المكتب.

لقد كنت أستخدم ManagedSpy لتحديد اسم فئة نافذة تطبيق .NET حتى أتمكن من استخدام وظيفة API Win32 FindWindowEx لجعل أحد النوافذ الفرعية نشطة ، ويعمل بشكل جيد. ومع ذلك ، أواجه مشكلة عندما يكون التطبيق يعمل فوق RemoteApp.

لا يزال بإمكاني استخدام .NET Process.GetProcessesByName() للعثور على التطبيق ، يجب أن أستدعه فقط mstsc.exe:

IntPtr hwndChild = IntPtr.Zero;
Process[] processess = Process.GetProcessesByName("mstsc");
IntPtr appHandle = IntPtr.Zero;

foreach (Process p in processess)
{
    if ((p.MainWindowHandle != IntPtr.Zero))
    {
        appHandle = p.MainWindowHandle;
    }
}

if (appHandle == IntPtr.Zero)
{
    MessageBox.Show("Application is not Running.");
    return;
}

ومع ذلك ، لا يمكنني استخدام FindWindowEx بنفس الطريقة. هذا السؤال يدور حول ذلك.

بالنسبة للكود غير المُدار ليخبرني ما هي Windows mstsc.exe نشط ، لقد استخدمت spy ++ ، ولكن ل mstsc.exe يعود باسم فئة مختلفة ، تسمى RAIL_WINDOW:

alt text

إليك الرمز الذي أستخدمه للعثور على نافذة الطفل:

[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
hwndChild = FindWindowEx(appHandle, IntPtr.Zero, "RAIL_WINDOW", "MyApplication (Remote)");
SetForegroundWindow(hwndChild);

أسئلة

  1. يمكنني استخدام Spy ++ لتسليط الضوء على نافذة الطفل النشطة في إصدار RemoteApp من التطبيق ، وأحصل RAIL_WINDOW, ، لكن لا يمكنني الوصول إلى هذه النافذة برمجياً. بالنظر إلى الرمز أعلاه ، ما الذي أفتقده لأكون قادرًا على القيام بذلك؟

  2. هل هناك طرق أخرى لإرسال ضربات لوحة المفاتيح إلى تطبيق يعمل عبر التطبيق عن بُعد؟

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

المحلول

معرفة كيف تقوم Microsoft بالأشياء ، سأراهن على أن "نافذة السكك الحديدية" ليست أكثر من وكيل محلي غبي لا يكلف نفسه عناء الاستجابة لما يرسله SendKeys. لم أنظر ، لكنني سأراهن على إرسال رسائل WM_CHAR ، والتي ربما لن يزعجها وكيل غبي بالرد. بدلاً من ذلك ، حاول إرسال رسائل WM_Keyup و WM_Keydown يدويًا ومعرفة ما إذا كان ذلك يعمل ، بالنظر إلى أنني أتوقع أن ينقل هذه النقرات ونقرات الماوس (وما لا) بدلاً من الإصدارات المترجمة.

نصائح أخرى

ما الأوامر التي ترسلها باستخدام SendKeys()?

قد يكون من الأفضل البحث عن حل بديل بدلاً من استخدام "SendKeys ()".

وربما يمكنك الاستفادة من التعامل مع imstscaxevents ::onremotewindowdisplayed الحدث الذي يمنحك مقبض النافذة المناسب في الوقت المناسب دون الاتصال بـ FindWindowex ، إلخ.

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