Frage

Hintergrund

Ich verwende SendKeys() Tastaturbefehle an das aktive Fenster zu senden, aber ich habe kein Glück, das Kind Fenster zu finden, wenn die Anwendung durch RemoteApp läuft. Alles funktioniert wie erwartet, wenn ich die Anwendung lokal ausgeführt werden.

Microsoft RemoteApp ermöglicht Benutzer Schließen sie das RDP-Protokoll auf Anwendungen durch, sondern die gesamte virtuelle Remote-Maschine zu zeigen, es zeigt nur das Anwendungsfenster. Für die Endbenutzer, gibt es keinen Unterschied zwischen einer Anwendung unter RemoteApp laufen und es läuft auf ihrem Desktop.

Ich habe ManagedSpy wurde mit dem Klassennamen der .NET-Anwendungsfenster zu bestimmen, so dass ich die Win32-API-Funktion FindWindowEx verwenden kann, eine der untergeordneten Fenster aktiv zu machen, und es funktioniert gut. Aber ich habe ein Problem, wenn die Anwendung über RemoteApp ausgeführt wird.

Ich kann immer noch das .NET Process.GetProcessesByName() verwenden, um die Anwendung zu finden, ich muss es nur invoke mstsc.exe haben:

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;
}

Allerdings kann ich nicht FindWindowEx auf die gleiche Art und Weise nutzen. Diese Frage dreht sich um die.

Für den nicht verwalteten Code, mir zu sagen, was Fenster mstsc.exe aktiv hat, habe ich Spy ++, aber für mstsc.exe es kommt wieder mit einem anderen Klassennamen, genannt RAIL_WINDOW:

alt text

Hier ist der Code, den ich mit dem Kind Fenster zu finden:

[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);

Fragen

  1. kann ich Spy ++ verwenden, das aktive Kind-Fenster in der RemoteApp Version der Anwendung zu markieren, und ich RAIL_WINDOW bekommen, aber ich kann scheinen nicht programmatisch dieses Fenster zuzugreifen. der Code oben gegeben, was bin ich in der Lage sein fehlt, dies zu tun?

  2. Gibt es andere Möglichkeiten der Tastaturanschläge an eine Anwendung zu senden läuft über Remote App?

War es hilfreich?

Lösung

Zu wissen, wie Microsoft Dinge tut, ich werde die „rail Fenster“ Wette ist nichts anderes als ein stummer, lokaler Proxy, der nicht reagiert stört, was Tastaturbefehl sendet. Ich habe nicht sah, aber ich werde, dass die Enden Wette bis WM_CHAR das Senden von Nachrichten, an die ein dummer Proxy würde wahrscheinlich reagiert nicht stören. Stattdessen versuchen Sie es WM_KEYUP und WM_KEYDOWN Nachrichten manuell und sehen, ob das funktioniert das Senden, da ich erwarte, dass es diese und Mausklicks (und was nicht), anstatt die übersetzten Versionen übertragen würde.

Andere Tipps

Was Befehle senden Sie SendKeys() mit?

Es ist besser für eine alternative Lösung zu suchen, kann anstelle der Verwendung von `Sendkeys ()‘.

Und man kann wohl ausnutzen IMsTscAxEvents Handhabung ::

scroll top