Фон
Я использую 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
:
Вот код, который я использую, чтобы найти дочернее окно:
[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);
Вопросы
Я могу использовать Spy ++, чтобы выделить активное дочернее окно в версии приложения RemoteApp, и я получаю RAIL_WINDOW
, но я не могу получить доступ к этому окну программно.Учитывая приведенный выше код, что мне не хватает, чтобы иметь возможность сделать это?
Существуют ли другие способы отправки нажатий клавиш в приложение, запущенное через Remote App?