に存在していても、私のウィンドウハンドルを見つけることができません。そのメッセージで[OK]をクリックすると、実行中の既存のインストールウィンドウにフォーカスが戻ってきます。私は現在次のコードを持っています:GetWindowThreadProcessIdは、そのプロセスIDは、私は、ユーザーが二度同じセットアップをクリックすると、彼らは「別のセットアップのインスタンスが既に実行中」のメッセージをポップアップになるだろうというセットアップアプリケーションを持っているウィンドウ
if("setup.exe" == CString(buffer))
EnumWindows(EnumWindowsProc,(LPARAM)processID);
BOOL CALLBACK EnumWindowsProc(HWND windowHandle,LPARAM lParam)
{
DWORD searchedProcessId = (DWORD)lParam;
DWORD windowProcessId = 0;
GetWindowThreadProcessId(windowHandle,&windowProcessId);
if(searchedProcessId == windowProcessId)
{
//Set focus when detects the right window.
SetForegroundWindow(windowHandle);
return FALSE;
}
return TRUE;
}
上記のコードは、インストールウィザード(インストールシールド)の最初の画面/ステップに留まっている場合に機能します。
インストールウィザードで次の画面に移動すると、このフォーカスロジックは機能しなくなります。デバッグ時にGetWindowThreadProcessId関数がsearchedProcessIdに一致するwindowProcessIDを見つけることができませんでした。また、次のことを確認しました:
- 私が第1または第2インストール画面にいても、searchProcessIdの値は変わりません。
- 私はウィンドウのタスクマネージャーで表示するとsearchProcessID値が存在することを確認しました。
私はGetWindowThreadProcessIdをよく読んで、以下の注意事項を参照してください。「戻り値はウィンドウを作成したスレッドの識別子である。」を私自身の解釈では、これはウィザードの2番目のステップ/画面が独自のスレッドによって生成されたためですか?
私はEnumChildWindow()関数をいじってみましたが、それは助けにはなりませんでした。私は誰もがこれを動作させるようにしようとするの正しい方向で私を指すことができる場合、非常にappricatedだろうか?