Comment déterminer lorsque le processus est prêt donné naissance? (À l'aide CreateProcess () et FindWindow ())
-
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?
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.