9

CreateProcess()これは簡単なことです。win32関数を使用してプロセスを生成するプログラムを作成しています。このプロセスがロードされると、を使用してウィンドウを見つけ、を使用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)の間にスレッドを待機させると、正常に機能します。しかし、これは非常に悪いハックのように感じます。CreateProcessFindWindow

どうすればこれを改善できますか?

4

4 に答える 4

9

(編集):ユーザーIInspectableは、の問題を指摘し、代わりにCBTフックWaitForInputIdle()を提案しました。

(...)SetWindowsHookEx関数で使用されるコールバック 関数。システムは、ウィンドウをアクティブ化、作成、(...)する前に、この関数を呼び出します。(...他の多くのもの)。

また、CBTは、何らかの理由でコンピューターベースのトレーニングの略です。

(古い、注意してください。コメントを参照してください。) WaitForInputIdle()を探しています。引用:

親プロセスが子プロセスを作成すると、CreateProcess関数は、子プロセスが初期化を完了するのを待たずに戻ります。子プロセスとの通信を試みる前に、親プロセスはWaitForInputIdle関数を使用して、子の初期化がいつ完了したかを判別できます。

于 2010-11-05T15:47:08.767 に答える
2

WaitForInputIdleを見たことがありますか?

于 2010-11-05T15:48:18.683 に答える
1

開始しているプロセスが変更可能なプロセスである場合は、準備ができたら親にメッセージを返送してもらいます。親のHWNDをコマンドラインパラメーターとして渡すかFindWindow、親が一意になることを保証できる場合に使用できます。

于 2010-11-05T15:46:28.380 に答える
1

両方のプロセスのソースコードはあなたの管理下にあると思います。

  • 2番目のプロセスが最初のプロセスのメッセージウィンドウの必要な詳細を知っている場合は、準備ができたら2番目のプロセスに最初のプロセスにメッセージを送信させることができます。
  • または、最初のプロセスで、イベントやミューテックスなどの合意された名前付き同期オブジェクトが2番目のプロセスから設定されるのを待つことができます。
于 2010-11-05T15:49:08.837 に答える