2012-03-29 18 views
0

に存在していても、私のウィンドウハンドルを見つけることができません。そのメッセージで[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だろうか?

答えて

1

Visual Studioなどのシステム監視ツールに付属のSpy++を使用して、すべてのウィンドウ/スレッドを表示するので、インストールウィザードの動作を正確に確認できます。チャンスはEnumWindows()で問題なく動作しています。これはコードや問題の前提条件に問題があります。

関連する問題