スポーン化されたプロセスの準備ができた時期を判断する方法は? (createprocess()およびfindWindow()を使用して
-
29-09-2019 - |
質問
これは簡単なものでなければなりません:Win32を使用してプロセスを生成するプログラムを作成しています CreateProcess()
働き。このプロセスがロードされると、そのウィンドウを使用していることがわかります FindWindow
使用してメッセージを送信します SendMessage()
. 。質問は、 そのウィンドウがメッセージを受け入れる準備ができていることをどのように知ることができますか?
以下を検討してください。
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);
}
上記のコードは(ほぼ?)常に失敗します。ウィンドウを作成することはできず、すぐにそれを見つけました。スレッドを待つ場合は、たとえば Sleep(1000)
, 、 間に CreateProcess
と FindWindow
呼び出し、それは正常に動作します。しかし、これは次のように感じます 非常に 悪いハック。
どうすればこれを改善できますか?
解決
(編集): ユーザーIISSPECTALE と指摘された問題 WaitForInputIdle()
, 、そして提案されました CBTフック 代わりは。
(...)で使用されるコールバック関数 setwindowshookex働き。システムは、ウィンドウをアクティブ化、作成、(...)を作成する前にこの関数を呼び出します。 (...他の多くのこと)。
また、CBTは、何らかの理由でコンピューターベースのトレーニングの略です。
(古い、注意してください、コメントを参照してください。)あなたは探しています waitforinputidle(). 。引用:
親プロセスが子プロセスを作成すると、CreateProcess関数は、子プロセスが初期化を終了するのを待たずに戻ります。子プロセスと通信しようとする前に、親プロセスはWaitforInputidle関数を使用して、子供の初期化がいつ完了したかを判断することができます。
他のヒント
見たことがありますか waitforinputidle?
開始プロセスが変更できるプロセスである場合は、準備ができたら親にメッセージを送信してもらいます。親のhwndをコマンドラインパラメーターとして渡すか、使用できます。 FindWindow
親が一意になることを保証できる場合。
両方のプロセスのソースコードがあなたの管理下にあると仮定します。
- 2番目のプロセスは、最初のプロセスのメッセージウィンドウの必要な詳細を知っている場合、準備が整ったときに最初のプロセスを投稿することができます。
- または、最初のプロセスで、2番目のプロセスから設定されているイベントやミューテックスなどの合意された同期オブジェクトを待つことができます。