Frage

Ich bin eine Anwendung mit seinem Hauptfenster, indem Sie den folgenden Code versteckt zu erstellen:

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;
}

Alles funktioniert einwandfrei, außer meine Hauptanwendung (der Aufruf dieser Code) Fenster den Fokus verliert, wenn ich das neue Programm öffnen. Ich habe versucht, die Priorität des neuen Verfahrens senken aber der Fokus Problem ist immer noch da.

Gibt es das überhaupt zu vermeiden? Des Weiteren ist es eine Möglichkeit, einen anderen Prozess zu erstellen, ohne Createprocess (oder eine der API ist, dass Call Create wie ShellExecute)?

Meine Vermutung ist, dass meine app Fokus verliert, weil es auf den neuen Prozess gegeben wurde, auch wenn es versteckt.

Für diejenigen von euch da draußen neugierig, die sicherlich die übliche fragen: „Warum wollen Sie, dies zu tun“, ist meine Antwort ist, weil ich einen Watchdog-Prozess haben, der nicht ein Dienst sein kann, und es wird gestartet, wenn ich meine Hauptanwendung öffnen . Zufrieden?

Danke für die Hilfe. Code wird geschätzt. Jess.

War es hilfreich?

Lösung

Die Anwendung, die Sie ausführen wird das Fenster Fokus nehmen.

Ein Weg, um dieses Problem zu umgehen ist Ihren neuen Prozess in einem neuen Desktop zu starten. Dies würde die Anwendung verhindert, stiehlt das Fenster Fokus auf Ihrem Desktop.

Der Code einen Prozess auf einem neuen Desktop laufen wie folgt aussehen sollte:

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

Andere Tipps

Klar, dass die Zielanwendung ehrt nicht die Showwindow-Flags. Sie müssen die gestartete Anwendung beheben, so dass es nicht gierig zu sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top