Domanda

Sto scrivendo un framework di test web per Windows che utilizza più browser per le applicazioni di test web. Voglio lanciare i browser nascosti, ma non funziona.

Sto utilizzando CreateProcess per avviare il browser con la bandiera SW_HIDE

STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
CreateProcess(NULL, const_cast<char*> (cmd.c_str()) , NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);

Funziona bene per Internet Explorer e altre applicazioni, ma non riesce con Firefox e altri browser. Sono consapevole del fatto che un processo è in grado di scegliere se seguire o meno le bandiere passati. C'è un modo che posso costringerlo a iniziare nascosta?

Probabilmente posso aspettare fino a quando il display della finestra e poi nasconderlo da ottenere un handle alla finestra aperta. Ma sto cercando la soluzione più pulita.

È stato utile?

Soluzione

Il problema è che il valore di wShowWindow viene utilizzato solo quando la funzione ShowWindow viene chiamata con il comando SW_SHOWDEFAULT, in aggiunta come FastAl ha detto il navigatore di creare un processo aggiuntivo per fare altre operazioni.
Sulla base di voi un'idea e la risposta di FastAl, si può fare questo per nascondere le finestre create dal processo che si è creato:
1.- Creare un elenco di processo con: CreateToolhelp32Snapshot, Process32First, Process32Next e CloseHandle; prendendo solo il processo che è stato creato dal processo che si è creato. Qui è una dimostrazione di come utilizzare queste funzioni, funziona con qualsiasi versione di Windows ad eccezione di Windows NT.
2.- Usa EnumWindows per enumerare le finestre sullo schermo e con il check GetWindowThreadProcessId se le finestre è stato creato da una delle processo recuperato nel passaggio precedente.
3.- Se le finestre è stato creato da uno dei processo definito nel passaggio 1; nascondere le finestre utilizzando la funzione ShowWindow.
È possibile monitorare il processo creato da te e verificare se nuovo processo / vengono creati finestre.

Altri suggerimenti

Si potrebbe lanciare i processi da un servizio (in esecuzione come utente NETWORK SERVICE per esempio). Questo impedirà loro di mostrare alcuna interfaccia utente. Sarà tuttavia impedire di essere in grado di guardare l'interfaccia utente a tutti, anche se si desidera in un secondo momento.

Un'altra opzione sarebbe quella di fare qualcosa con finestra stazioni e desktop, date un'occhiata alla sezione finestra Informazioni su stazioni e desktop su MSDN . Un'idea sarebbe quella di utilizzare CreateDesktop e poi specificando questo desktop come parametro lpDesktop nella struttura STARTUPINFO dato a CreateProcess. Se in un secondo momento si desidera visualizzare l'interfaccia utente, l'uso SwitchDesktop .

prova si.wShowWindow = 0; divertente questo ha funzionato per me, non SW_HIDE che dovrebbe portare lo stesso valore però.

È possibile avviare l'applicazione e quindi inviare un messaggio WM_SIZE alla sua finestra principale.

http://msdn.microsoft.com /en-us/library/ms632646(v=vs.85).aspx

MSDN , sembra che tu necessità di superare questo bandiera dwFlags.

STARTF_USESHOWWINDOW 0x00000001 - The wShowWindow member contains additional information.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top