Encontrar a janela infantil dentro de um remoteapp da Microsoft programaticamente
Pergunta
Fundo
estou a usar SendKeys()
Para enviar comandos de teclado para a janela ativa, mas não estou tendo sorte em encontrar a janela infantil quando o aplicativo estiver executando pelo RemoteApp. Tudo funciona como esperado quando eu executar o aplicativo localmente.
Microsoft RemoteApp Permite que os usuários se conectem aos aplicativos através do protocolo RDP, mas, em vez de mostrar toda a máquina virtual remota, ele apenas mostra a janela do aplicativo. Para o usuário final, não há diferença entre um aplicativo em execução no RemoteApp e em sua área de trabalho.
Eu tenho usado o GerenciedSpy para determinar o nome da classe da janela do aplicativo .NET para que eu possa usar a função Win32 API FindWindowEx
Para tornar uma das janelas infantis ativas e funciona bem. No entanto, estou tendo um problema quando o aplicativo está executando o RemoteApp.
Eu ainda posso usar o .net Process.GetProcessesByName()
Para encontrar o aplicativo, eu só tenho que invocar 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;
}
No entanto, eu não posso usar FindWindowEx
do mesmo jeito. Esta questão gira em torno disso.
Para o código não gerenciado me dizer o que o Windows mstsc.exe
tem ativo, usei Spy ++, mas para mstsc.exe
ele volta com um nome de classe diferente, chamado RAIL_WINDOW
:
Aqui está o código que estou usando para encontrar a janela infantil:
[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);
Perguntas
Eu posso usar o SPY ++ para destacar a janela infantil ativa na versão remoteApp do aplicativo, e eu recebo
RAIL_WINDOW
, mas não consigo acessar esta janela programaticamente. Dado o código acima, o que estou faltando para poder fazer isso?Existem outras maneiras de enviar traços de teclado para um aplicativo que executa o aplicativo remoto?
Solução
Saber como a Microsoft faz as coisas, aposto que a "janela do trilho" não passa de um proxy local e idiota que não se preocupe em responder ao que a SendKeys está enviando. Não olhei, mas aposto que acaba enviando mensagens WM_CHAR, às quais um proxy idiota provavelmente não se incomodaria em responder. Em vez disso, tente enviá -lo mensagens wm_keyup e wm_keydown manualmente e veja se isso funciona, já que espero que isso transmitisse esses e cliques do mouse (e o que não), em vez das versões traduzidas.
Outras dicas
Quais comandos você está enviando usando SendKeys()
?
Pode ser melhor procurar uma solução alternativa em vez de usar `sendkeys () '.
E você provavelmente pode aproveitar o manuseio de ImstsCaxEvents ::OnRemotewindowDisplay Evento que oferece a alça da janela adequada no momento certo sem ligar para FindWindowex, etc.