質問
私は外部アプリのウィンドウをフォアグラウンドに持ってくる必要があるアプリケーションを作成していますが、必ずしもフォーカスを盗む必要はありません(ユーザーがフォーカスを盗むか盗まないかを切り替えることができる設定があります)。
win32 API を使用してこれを行う最善の方法は何ですか?SetForeground() を試してみましたが、常にフォーカスを奪い、一貫して機能しません。
これについて最善の方法は何でしょうか?何かご意見は?
解決
SetForegroundWindow はフォーカスを盗むことになっており、場合によっては失敗することがあります。
SetForegroundWindow 関数は、指定されたウィンドウを作成したスレッドをフォアグラウンドに配置し、ウィンドウをアクティブにします。キーボード入力はウィンドウに向けられます
でフォーカスを捉えてみてください セットキャプチャ 電話をかける前に。ウィンドウを前面に表示するさまざまな方法も検討してください。SetForeGroundWindow、SetActiveWindow、マウス クリックのシミュレートでもこれを行うことができます。
他のヒント
SetForeGroundWindow、SetActiveWindow、BringWindowToTop の違いは何ですか?あたかもそれらはすべて同じことをしているように見えます。
MSDN によると、SetForeGroundWindow はウィンドウをアクティブ化し、キーボードのフォーカスをウィンドウに向けます。これは、プロセスがバックグラウンドにあるときでも機能しようとします。SetActiveWindow は SetForeGroundWindow と同じことを行いますが、アプリケーションが最前面のアプリケーションでない場合は何も行いません。最後に、BringWindowToTop はウィンドウを最上部に移動するだけで、キーボード フォーカスは変更しません。
フォーカスを盗まないように、BringWindowToTop 関数を試すことができます。私はそれを使ったことはありませんが、あなたが探しているもののようです。
SetWindowPos を使用してみましたか。これは、Windows で移動、サイズ変更、Z オーダーを設定するための標準関数です。使用できる SWP_NOACTIVATE フラグがあります。見る http://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx. 。別のプロセスに属するウィンドウではこれを試していませんが、おそらく試してみる価値はあります。
SetWindowPos + SWP_NOACTIVATE がその仕事を行います。
FindWindow を使用してウィンドウの HWND を取得し、Win32 API にある BringWindowToTop 関数を使用できます。