Wie zu bestimmen, wann erzeugten Prozess fertig ist? (Mit Createprocess () und Findwindow ())

StackOverflow https://stackoverflow.com/questions/4107499

  •  29-09-2019
  •  | 
  •  

Frage

Dies sollte leicht sein: Ich habe ein Programm erschaffe, dass Spawns ein Prozess der win32 CreateProcess() Funktion. Sobald dieser Prozess geladen wird, finde ich das Fenster FindWindow verwenden und es Nachrichten mit SendMessage() senden. Die Frage ist, wie kann ich wissen, wenn das Fenster Nachrichten bereit ist zu akzeptieren?

Beachten Sie Folgendes:

HWND wnd;

BOOL Start()
{
  // Spawn the process
  if (! CreateProcess(...))
    return FALSE;

  // Find the process's window (class and name already known)
  wnd = FindWindow(MY_WINDOW_CLASS, MY_WINDOW_NAME);

  // Always returns FALSE because window has not yet been created.
  return (wnd != NULL);
}

Der obige Code (? Fast) immer scheitern; das Fenster kann nicht so schnell erstellt und gefunden werden. Wenn ich einen Thread warten setzen, sagen Sleep(1000) zwischen den CreateProcess und FindWindow Anrufe, es funktioniert gut. Aber das fühlt sich an wie ein sehr schlecht Hack.

Wie kann ich das verbessern?

War es hilfreich?

Lösung

(Edit): Benutzer IInspectable wies darauf hin, Probleme mit WaitForInputIdle(), und schlug vor, CBT Haken statt.

  

(...) Callback-Funktion mit dem SetWindowsHookEx   Funktion. Das System ruft diese Funktion vor der Aktivierung,   Erstellen (...) ein Fenster; (... viele andere Dinge).

Auch CBT ist die Abkürzung für Computer Based Training, egal aus welchem ??Grund.

(Alt, passen sie auf, siehe Kommentare.) Sie suchen WaitForInputIdle () . Zitat:

  

Wenn ein Eltern-Prozess erstellt ein Kind   Verfahren wird die Funktion Create   Rückkehr ohne für das Kind wartet   verarbeiten seine Initialisierung zu beenden.   Bevor Sie versuchen, mit der kommunizieren   Kind-Prozess, kann der übergeordneten Prozess   Verwenden Sie die WaitForInputIdle Funktion   bestimmen, wann das Kind   Initialisierung abgeschlossen ist.

Andere Tipps

Haben Sie unter WaitForInputIdle ?

Wenn der Prozess Sie beginnen ist, die Sie ändern können, haben sie eine Nachricht zurück an die Eltern schicken, wenn es fertig ist. Sie können die HWND des Mutter als Befehlszeilenparameter übergeben, oder die Verwendung FindWindow wenn Sie garantieren können, dass die Mutter einzigartig sein wird.

Ich gehe davon aus, dass der Quellcode der beiden Prozesse unter Kontrolle ist.

  • Sie können der zweite Prozess lassen Sie eine Nachricht an den ersten Beitrag, wenn es fertig ist, wenn der zweite die benötigten Details des ersten Prozesses Meldungsfenster weiß.
  • Sie können auch für ein vereinbarten Namen Synchronisationsobjekt in dem ersten Prozess warten, wie Ereignis oder Mutex, wobei Satz aus dem zweiten Prozess.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top