Domanda

Sfondo

sto usando SendKeys() per inviare comandi da tastiera per la finestra attiva, ma non sto avendo alcuna fortuna trovare la finestra secondaria quando l'applicazione è in esecuzione attraverso RemoteApp. E tutte le opere come previsto quando si esegue l'applicazione a livello locale.

Microsoft RemoteApp consente agli utenti di collegare alle applicazioni attraverso il protocollo RDP, ma invece di mostrare l'intera macchina remota virtuale, mostra solo la finestra. Per l'utente finale, non c'è differenza tra un'applicazione in esecuzione sotto RemoteApp e in esecuzione sul proprio desktop.

Ho usato ManagedSpy per determinare il nome di classe della finestra dell'applicazione .NET in modo da poter utilizzare la funzione API Win32 FindWindowEx a fare una delle finestre bambino attivo, e funziona bene. Tuttavia, sto avendo un problema quando l'applicazione è in esecuzione su RemoteApp.

posso ancora usare il Process.GetProcessesByName() .NET per trovare l'applicazione, devo solo per averlo invoke 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;
}

Tuttavia, non posso utilizzare FindWindowEx nello stesso modo. Questa domanda che ruota attorno.

Per il codice non gestito me per dire che cosa le finestre mstsc.exe ha attiva, ho usato Spy ++, ma per mstsc.exe ritorna con un nome di classe diversa, denominata RAIL_WINDOW:

alt text

Ecco il codice che sto usando per trovare la finestra figlia:

[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);

Domande

  1. posso usare Spy ++ per evidenziare la finestra secondaria attiva nella versione RemoteApp dell'applicazione, ed ottengo RAIL_WINDOW, ma io non riesco a accedere a questa finestra di programmazione. Dato il codice di cui sopra, che cosa mi manca per essere in grado di farlo?

  2. Ci sono altri modi per l'invio di colpi di tastiera a un'applicazione in esecuzione su Remote App?

È stato utile?

Soluzione

Saper Microsoft fa le cose, scommetto la "finestra rail" non è altro che uno stupido, proxy locale che non si preoccupa di rispondere a ciò che SendKeys sta inviando. Non ho guardato, ma scommetto che finisce per l'invio di messaggi WM_CHAR, a cui un proxy muto probabilmente non sarebbe stato un problema rispondere. Invece, provare a inviare messaggi che WM_KEYUP e WM_KEYDOWN manualmente e vedere se funziona, visto che mi aspetto dovrebbe trasmettere quelle e clic del mouse (e non che cosa), piuttosto che le versioni tradotte.

Altri suggerimenti

Quali comandi stai inviando tramite SendKeys()?

Può essere meglio cercare una soluzione alternativa invece di utilizzare `SendKeys ()'.

E probabilmente si può usufruire di gestire IMsTscAxEvents :: OnRemoteWindowDisplayed caso in cui si dà l'handle di finestra corretta al momento giusto senza chiamare FindWindowEx, ecc.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top