0

別のアプリのウィンドウを一番上にして、自分のアプリをクリックすると他のアプリのダイアログが表示されるようにします。私が抱えている問題は、電話をかけた後、アプリにフォーカスが戻らないことです。他のアプリにさらに多くのウィンドウがある場合、そのうちの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);
4

3 に答える 3

2

関連:Process.MainWindowHandleの予期しない動作

基本的に、MainWindowHandleは、ドキュメントに記載されている内容に関係なく、プロセスの現在の最上位ウィンドウを提供します。

これが、他のプロセスのメインウィンドウが必ずしもフォーカスされない理由を説明しています。

もう1つの問題は、アプリを提供した後、アプリにフォーカスを戻さないことです。

実際、あなたがしていることの正しい用語は、zオーダーを確立することです。

保証できないz-orderを制御しようとする代わりに、他のプロセスにメッセージを送信する方がよい場合があります。

于 2008-10-23T16:11:39.887 に答える
2

SWP_NOACTIVATE を試しましたか?

于 2008-10-23T17:25:36.853 に答える
0

[実際に使用したソリューション]

これまでは、呼び出し元のウィンドウのウィンドウハンドルをターゲットアプリに送信し、終了時にウィンドウハンドルを上にプッシュして戻します。対処するウィンドウが約50あるので、これは本当に苦痛ですが、安定しているようです。次のアプローチは、これに問題があることが判明した場合、呼び出し元のアプリにコールバックして、ウィンドウを前面にプッシュするように依頼することですが、ユーザーが何かを実行できる可能性があるため、私はむしろそうしません。メッセージの転送中に呼び出し元のアプリ(同じトランスポートプロトコルで大量のメッセージが着信する場合にのみ問題が発生する可能性があります)

着信ウィンドウハンドルを使用して、ターゲットアプリに表示されるウィンドウの親をそのハンドルに設定しないでください。表示されるダイアログが呼び出し元のアプリウィンドウの境界内に表示され、必要に応じてトリミングされるだけです-役に立たない

上記の質問に対する回答に感謝します

于 2008-10-27T21:58:33.737 に答える