Поиск дочернего окна внутри Microsoft RemoteApp программно - PullRequest
4 голосов
/ 01 октября 2010

Фон

Я использую SendKeys() для отправки команд клавиатуры в активное окно, но мне не повезло найти дочернее окно, когда приложение выполняется через RemoteApp.Все это работает, как и ожидалось, когда я запускаю приложение локально.

Microsoft RemoteApp позволяет пользователям подключаться к приложениям по протоколу RDP, но вместо отображения всей удаленной виртуальной машины, он просто показываетокно приложения.Для конечного пользователя нет никакой разницы между приложением, запущенным в RemoteApp, и приложением, запущенным на их рабочем столе.

Я использовал ManagedSpy для определения имени класса окна приложения .NET, чтобы я мог использовать функцию Win32 API 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. Существуют ли другие способы отправки нажатий клавиш в приложение, запущенное через Remote App?

Ответы [ 3 ]

2 голосов
/ 06 октября 2010

Зная, как Microsoft работает, я готов поспорить, что «железнодорожное окно» - не более чем тупой локальный прокси-сервер, который не беспокоится о том, что посылает SendKeys. Я не смотрел, но держу пари, что в итоге отправляются сообщения WM_CHAR, на которые тупой прокси, вероятно, не будет отвечать. Вместо этого попробуйте отправить ему сообщения WM_KEYUP и WM_KEYDOWN вручную и посмотреть, работает ли это, учитывая, что я ожидаю, что он будет передавать те и щелчки мышью (а что нет), а не переведенные версии.

0 голосов
/ 28 июля 2014

И вы, вероятно, можете воспользоваться обработкой события IMsTscAxEvents :: OnRemoteWindowDisplayed , которое дает правильный дескриптор окна в нужное время без вызова FindWindowEx и т. Д.

0 голосов
/ 05 октября 2010

Какие команды вы отправляете, используя SendKeys()?

Может быть, лучше поискать альтернативное решение вместо использования `SendKeys () '.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...