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:

alt text

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

  1. 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?

  2. Existem outras maneiras de enviar traços de teclado para um aplicativo que executa o aplicativo remoto?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top