Нахождение дочернего окна внутри Microsoft Remoteapp программно

StackOverflow https://stackoverflow.com/questions/3841486

Вопрос

Задний план

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

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

Я использовал ManagedSpy, чтобы определить имя класса окна .NET приложения, чтобы я мог использовать функцию API Win32 FindWindowEx Чтобы сделать один из детей Windows Active, и он работает хорошо. Однако у меня возникла проблема, когда приложение работает над 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 так же. Этот вопрос вращается вокруг этого.

Для неуправляемого кода, чтобы сказать мне, какие окна 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_CARH, на которые, вероятно, не будет беспокоиться. Вместо этого попробуйте отправить его сообщения WM_KEYUP и WM_KEYDOWDOWDALD и посмотреть, если это работает, учитывая, что я ожидаю, что это будет передавать, а щелчки мыши (и что нет), а не переведенные версии.

Другие советы

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

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

И вы, вероятно, можете воспользоваться услугами IMSTSCAXEVENTS ::Onremotewindowdisplayed Событие, которое дает вам правильную ручку окна в нужное время, не вызывая FindWindowex и т. Д.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top