別のアプリのウィンドウを一番上にした後にフォーカスが失われる
質問
他のアプリのウィンドウを一番上にして、アプリ内のクリックで他のアプリのダイアログが表示されるようにします。私が抱えている問題は、通話後にアプリにフォーカスが戻らないことです。他のアプリにさらにウィンドウがある場合、そのうちの1つにフォーカスが置かれます。そうしないと、ウィンドウ(タスクバーのみを見る)がフォーカスを取得しません。問題の調査はどこから始めればよいですか?
他のアプリを最上位にするための私のコードは次のとおりです。
Process p = Process.GetProcessById(trackedProcessID);
IntPtr h = p.MainWindowHandle;
uint TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE | SWP_ASYNCWINDOWPOS;
SetWindowPos(h, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
定数として
public static readonly uint SWP_NOMOVE = 0x0002;
public static readonly uint SWP_NOSIZE = 0x0001;
public static readonly uint SWP_ASYNCWINDOWPOS = 0x4000;
public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
解決
関連: Process.MainWindowHandleの予期しない動作
基本的に、MainWindowHandleは、ドキュメントに書かれていることにもかかわらず、プロセスの現在の一番上のウィンドウを提供します。
これは、他のプロセスのメインウィンドウが必ずしもフォーカスを取得しない理由を説明しています。
他の問題は、アプリを渡した後、アプリにフォーカスを戻さないことです。
実際、あなたがしていることの正しい用語は、 z-order を確立することです。 。
zオーダーを制御しようとする代わりに(保証はできません)、他のプロセスにメッセージを送信した方がよい場合があります。
他のヒント
SWP_NOACTIVATEを試しましたか?
[使用した実際のソリューション]
ここまでは、呼び出し元のウィンドウのウィンドウハンドルをターゲットアプリに送信し、終了したらそれを一番上に戻すようにしました。 〜50個のウィンドウを処理する必要があるため、これは非常に苦痛ですが、安定しているようです。次のアプローチは、これに問題があることが判明した場合、呼び出し元のアプリにコールバックして、ウィンドウをフォアグラウンドにプッシュするように依頼することですが、ユーザーが何かをできる可能性を導入するのではなく、メッセージの転送中に呼び出し元アプリ(同じトランスポートプロトコルで多くのメッセージが送信される場合にのみ問題が発生する可能性があります)
着信ウィンドウハンドルを使用して、ターゲットアプリに表示されるウィンドウの親をそのハンドルに設定しようとしないでください。表示されるダイアログを呼び出し元アプリウィンドウの境界内に表示し、必要に応じてトリミングします。役に立たない
質問に対する上記の回答に感謝します