Question

Historique

J'utilise SendKeys() pour envoyer des commandes clavier à la fenêtre active, mais je ne suis pas avoir une chance de trouver la fenêtre enfant lorsque l'application est en cours d'exécution par RemoteApp. Tout fonctionne comme prévu quand je lance l'application localement.

Microsoft RemoteApp permet aux utilisateurs de se connecter à des applications via le protocole RDP, mais au lieu de montrer l'ensemble de la machine virtuelle à distance, il montre à la fenêtre d'application. Pour l'utilisateur final, il n'y a pas de différence entre une application en cours d'exécution sous RemoteApp et en cours d'exécution sur leur bureau.

Je me sers ManagedSpy pour déterminer le nom de la classe de la fenêtre d'application .NET afin que je puisse utiliser la fonction API Win32 FindWindowEx pour faire l'une des fenêtres de l'enfant actif, et il fonctionne bien. Cependant, je vais avoir un problème lorsque l'application est en cours d'exécution sur RemoteApp.

Je peux toujours utiliser le Process.GetProcessesByName() .NET pour trouver l'application, je dois juste avoir Invoke 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;
}

Cependant, je ne peux pas utiliser FindWindowEx de la même manière. Ce qui tourne autour de questions.

Pour le code non managé pour me dire ce que les fenêtres mstsc.exe a actif, j'ai utilisé Spy ++, mais pour mstsc.exe il revient avec un nom de classe différente, appelée RAIL_WINDOW:

text alt

Voici le code que je utilise pour trouver la fenêtre enfant:

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

Questions

  1. Je peux utiliser Spy ++ pour mettre en évidence la fenêtre enfant active dans la version RemoteApp de l'application, et je reçois RAIL_WINDOW, mais je ne peux pas sembler accéder à cette fenêtre par programmation. Vu le code ci-dessus, qu'est-ce que je manque de pouvoir le faire?

  2. Y at-il d'autres façons d'envoyer des coups de clavier à une application en cours d'exécution sur App à distance?

Était-ce utile?

La solution

Savoir comment Microsoft fait des choses, je parie que la « fenêtre de chemin de fer » est rien de plus qu'un muet, proxy local qui ne prend pas la peine de répondre à ce que SendKeys émet. Je ne l'ai pas regardé, mais je parie que finit d'envoyer des messages WM_CHAR, auquel une procuration stupide ne serait probablement pas pris la peine de répondre. Essayez plutôt l'envoyer des messages WM_KEYUP et WM_KEYDOWN manuellement et voir si cela fonctionne, étant donné que je pense qu'il transmettrait ceux-ci et les clics de souris (et ce non) plutôt que les versions traduites.

Autres conseils

Quelles commandes envoyez-vous en utilisant SendKeys()?

Il peut être préférable de chercher une solution de rechange au lieu d'utiliser `SendKeys ().

Et vous pouvez probablement profiter de la manipulation IMsTscAxEvents ::

scroll top