Comment déterminer lorsque le processus est prêt donné naissance? (À l'aide CreateProcess () et FindWindow ())

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

  •  29-09-2019
  •  | 
  •  

Question

Cela devrait être facile: Je suis en train de créer un programme qui génère un processus en utilisant la fonction CreateProcess() win32. Une fois que ce processus est chargé, je trouve sa fenêtre à l'aide FindWindow et de l'envoyer des messages en utilisant SendMessage(). La question est, Comment puis-je savoir quand cette fenêtre est prête à accepter les messages?

Considérez ce qui suit:

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

Le code ci-dessus (? Presque) ne parviennent pas toujours; la fenêtre ne peut pas être créé et a constaté que rapidement. Si je mets un fil d'attente, dire Sleep(1000), entre les appels CreateProcess et FindWindow, il fonctionne très bien. Mais cela se sent comme très mauvais hack.

Comment puis-je améliorer cela?

Était-ce utile?

La solution

(Edit): utilisateur IInspectable a des problèmes avec WaitForInputIdle(), et a suggéré CBT crochets à la place.

  fonction de rappel

(...) utilisé avec le SetWindowsHookEx   une fonction. Le système appelle cette fonction avant d'activer,   la création, (...) d'une fenêtre; (... beaucoup d'autres choses).

En outre, la TCC est l'abréviation de formation assistée par ordinateur, quelle qu'en soit la raison.

(Vieux, méfiez-vous, voir les commentaires.) Vous cherchez WaitForInputIdle () . Citation:

  

Quand un processus parent crée un enfant   processus, la fonction CreateProcess   retours sans attendre l'enfant   traiter à la fin de son initialisation.   Avant d'essayer de communiquer avec le   processus enfant, le processus parent peut   utiliser la fonction de WaitForInputIdle   déterminer quand l'enfant est   l'initialisation est terminée.

Autres conseils

Avez-vous regardé WaitForInputIdle ?

Si le processus que vous commencez est celui que vous pouvez changer, le faire envoyer un message de retour au parent quand il est prêt. Vous pouvez passer le HWND du parent en tant que paramètre de ligne de commande, ou l'utilisation FindWindow si vous pouvez garantir que le parent sera unique.

Je suppose que le code source des deux processus est sous votre contrôle.

  • Vous pouvez laisser le second processus envoyer un message à la première quand il est prêt, si le second connaît les détails nécessaires du premier processus fenêtre de message.
  • Ou vous pouvez attendre dans le premier processus d'un convenu objet de synchronisation nommée, comme événement ou mutex, être ensemble du second processus.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top