外部アプリのウィンドウをフォアグラウンドに移動する必要があり、必ずしもフォーカスを盗む必要のないアプリケーションを作成しています (ユーザーがフォーカスを盗む/盗まないように切り替えることができる設定があります)。
win32 API を使用してこれを行う最善の方法は何ですか? SetForeground() を試しましたが、常にフォーカスが奪われ、一貫して機能しません。
これについて最善の方法は何ですか?何かご意見は?
SetForegroundWindow はフォーカスを奪うことになっていますが、失敗する場合があります。
SetForegroundWindow 関数は、指定されたウィンドウを作成したスレッドをフォアグラウンドに置き、ウィンドウをアクティブにします。キーボード入力はウィンドウに向けられます
呼び出しを行う前に、 SetCaptureでフォーカスをキャプチャしてみてください。また、ウィンドウを前面に移動するさまざまな方法を調べてください: 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 関数を使用できます。