Questa domanda su StackOverflow presenta un programma Win32 minimale scritto in C che avvia alcuni processi (Blocco note e Calc) utilizzando CreateProcess
.
Il problema dell'OP è che le finestre di questi programmi vengono visualizzate in background, dietro la finestra di Explorer da cui viene avviato il programma di esempio.
Anche se la domanda è chiusa come duplicato, l'OP ha trovato una soluzione che non è stata trovata nella risposta di riferimento. La soluzione consiste nell'inserire una singola chiamata TranslateMsg
al programma, prima che la chiamata di CreateProcess
:
MSG msg;
TranslateMessage(&msg);
Con questo in atto, le finestre dei processi avviati appaiono in primo piano, come previsto.
La mia domanda è: qualcuno che ha un po 'di conoscenza sugli interni di Windows spiega come questa chiamata di TranslateMessage
sta aiutando?
La chiamata non è ben definita nell'utilizzo sopra; TranslateMessage
dovrebbe funzionare su un messaggio estratto dalla coda dei messaggi. L'oggetto msg
non è nemmeno inizializzato. Il trucco funziona ancora se lo cambiamo in MSG msg = { 0 }
. Sembra esserci un bug / hack in Windows basato sull'idea che se un processo non chiama mai TranslateMessage
, allora è un processo in background, e la finestra di ogni processo generato da esso va in background. Anche una chiamata inutile a TranslateMessage
con dati spazzatura è sufficiente per ingannare questo kludge.