Domanda

Sto creando un'applicazione con la sua finestra principale nascosta usando il seguente codice:

STARTUPINFO siStartupInfo;
PROCESS_INFORMATION piProcessInfo;

memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));

siStartupInfo.cb = sizeof(siStartupInfo);
siStartupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_FORCEOFFFEEDBACK | STARTF_USESTDHANDLES;
siStartupInfo.wShowWindow = SW_HIDE;

if(CreateProcess(MyApplication, "", 0, 0, FALSE, 0, 0, 0, &siStartupInfo, &piProcessInfo) == FALSE)  
{
 // blah    
 return 0;
}

Tutto funziona correttamente tranne la finestra della mia applicazione principale (quella che chiama questo codice) perde attenzione quando apro il nuovo programma. Ho provato a ridurre la priorità del nuovo processo, ma il problema principale è ancora presente.

Esiste un modo per evitarlo? inoltre, esiste un modo per creare un altro processo senza utilizzare CreateProcess (o una delle API che chiamano CreateProcess come ShellExecute)?

La mia ipotesi è che la mia app stia perdendo attenzione perché è stata assegnata al nuovo processo, anche quando è nascosta.

A quelli di voi curiosi là fuori che sicuramente chiederanno il solito "perché vuoi fare questo", la mia risposta è perché ho un processo di controllo che non può essere un servizio e si avvia ogni volta che apro il mio principale applicazione. Soddisfatto?

Grazie per l'aiuto. Il codice sarà apprezzato. Jess.

È stato utile?

Soluzione

L'applicazione in esecuzione sta attivando Window.

Un modo per aggirare questo problema è avviare il nuovo processo su un nuovo desktop. Ciò impedirebbe all'applicazione di rubare lo stato attivo della finestra sul desktop.

Il codice per eseguire un processo su un nuovo desktop dovrebbe essere simile al seguente:

HDESK hOld = GetThreadDesktop( GetCurrentThreadId() );
HDESK hNew = OpenDesktop( "name", 0, FALSE, GENERIC_ALL );
SetThreadDesktop( hNew );
CreateProcess( ... );
SetThreadDesktop( hOld );
CloseDesktop( hNew );

Altri suggerimenti

Chiaramente l'applicazione di destinazione non sta onorando i flag ShowWindow. È necessario correggere l'applicazione avviata in modo che non sia avida.

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