患者の人口統計情報を管理するアプリケーションがあります。このデータとともに、ユーザーは患者の写真をスキャンし、その写真を患者に割り当てることができます。ユーザーがスキャン ボタンをクリックすると、別のアプリケーションがダイアログとして開き、画像をスキャンします。これをXPで実行すると、すべて正常に機能しました。イメージング アプリケーションは正常にロードされ、フォーカスを獲得しました。ただし、Vista では、イメージング アプリケーションがフォーカスされず、メイン アプリケーションの後ろにポップアップすることがあります。全画面表示または 2008 Application Server を介して実行すると、アプリケーションが表示されず、画面がロックされるだけで、何も起こらなかったように見えます。Vista のウィンドウ フォーカス管理を XP のように変更する方法はありますか? 可能であれば、実際のアプリケーションを変更せずにこれを解決する方法を探しています。
4 に答える
イメージング アプリケーションにフォーカスできるようにするには、アプリケーションに変更を加える必要があると思います。ShellExecute
アプリケーションがまたはを介してイメージング アプリケーションを起動すると仮定しますCreateProcess
。その場合、起動されたプロセスのプロセス ハンドルをSHELLEXECUTEINFO.hProcess
(for ShellExecute
) またはPROCESS_INFORMATION.hProcess
(for CreateProcess
) から取得できます。イメージング アプリケーションを起動した直後に、AllowSetForegroundWindow APIを呼び出します。
AllowSetForegroundWindow(GetProcessId(hProcess));
これにより、イメージング アプリケーションは、起動時にメイン ウィンドウ/ダイアログを前面に配置できます。
次の手順を試すことができます。
1. exe を右クリックします。
2. [プロパティ] を選択
します。 3. [互換性] タブを選択します。
4. [このプログラムを互換モードで実行する] をチェックします
。
すべてのトップレベルのHWNDを反復処理し、ウィンドウクラスを介してスキャンアプリケーションを識別してから、適切なメッセージを送信してウィンドウを上げることができます。
これは Vista と XP の関係ではないと思います。単純に、このイメージング アプリは Vista での起動に時間がかかると思います。Windows 2000 以降、ウィンドウ マネージャーは、バックグラウンド アプリケーションがフォアグラウンドを盗むのを防止してきました。アプリケーションが起動されると、フォアグラウンドを取るウィンドウを作成して表示する機会があります。時間がかかりすぎると、ウィンドウ マネージャーは、現在のウィンドウがフォアグラウンドを保持する必要があると判断し、他のアプリが最終的に起動したときにフォアグラウンドを取得することを禁止します。
これを回避する具体的な方法は考えられません...アプリの起動後にFindWindowを使用して他のアプリウィンドウを検索する以外に。最終的にそれを見つけたら、それに対して SetForegroundWindow を呼び出してフォアグラウンドに移動します。