2

デュアル モニター システムのプライマリ画面で、他のすべての上に浮かぶ必要がある "コントロール ツールバー" アプリがあります。それ自体をプライマリ画面の上部に配置し、TopMost=true に設定します。

このコントロール ツールバーを使用して、デュアル モニター システムの各モニターで 1 つずつ、全画面表示で実行するが TopMost を実行しない他の 2 つのプロセスを起動できます。これらのウィンドウは、BorderStyle を None に設定し、ウィンドウの境界を画面の寸法に正確に収まるように設定することで、フルスクリーンで実行するように設定されています。全画面表示のウィンドウがタスクバーを覆っても問題はありません。プライマリ モニターの全画面表示ウィンドウに一日中集中して操作でき、ツールバーは一番上に表示されたままです。

ただし、ソフトウェアの王国ではすべてが桃色というわけではありません。特定のアクションにより、TopMost 以外のフルスクリーン ウィンドウの下に TopMost ツールバーが表示されます。これらのアクションの 1 つは、セカンダリ モニターのフルスクリーン アプリにフォーカスを移し、プライマリ モニターのフルスクリーン アプリにフォーカスを戻すことです。これは、このシーケンスに従うたびに発生するため、再現するのが最も簡単な状況です。他のシナリオを確実に再現するのに苦労していますが、Windows キーを押してスタート メニューを表示し、Internet Explorer でブラウジングを開始すると、ブラウジングが終了して IE を閉じ、プライマリ モニターの全画面表示アプリにフォーカスを戻すと、 TopMost ウィンドウにポップします。

TopMost ウィンドウを一番上に保ち、TopMost 以外のフルスクリーン ウィンドウの下に表示させないようにする方法はありますか? WindowFromPoint を 1 秒に 1 回ポーリングして、ツールバーがまだ一番上にあるかどうかを確認し、そうでない場合は何らかの方法でポップバックするようなことをしてもかまいませんが、フルスクリーン アプリからフォーカスを奪いたくありません。ユーザーが使用しているため、Activate() は特に良い解決策ではありません。

これはあまり重要ではないと思いますが、ツールバーは WPF ウィンドウで、フルスクリーン アプリは WinForms です。

アップデート:

これをテストする最も簡単な方法は、F11 キーを押して各モニターの 2 つのブラウザー ウィンドウで全画面表示にし、全画面アプリをシミュレートしてから、TopMost ウィンドウを任意の場所にフローティングさせることです。2 つのフルスクリーン ウィンドウの間をクリックすると、その下に TopMost ウィンドウが表示されます。IE では 2 つのフルスクリーン ウィンドウを表示できないため、あるモニターで IE を開き、別のモニターで Chrome を開きました。

今のところActivate()ハックを実装しましたが、それはツールバーアプリをアクティブにしてフルスクリーンアプリのフォーカスを外し、フルスクリーンアプリの上にタスクバーをポップさせるため、かなり醜い解決策です。どのフルスクリーン アプリにフォーカスがあるかを切り替えるだけの場合は、ハックのようなものです。

4

1 に答える 1

3

さて、これが私がやったことです...あきらめる前にもう1つのアイデアを思いつきました。これはうまくいきます。ツールバー ウィンドウには、次のように、ツールバー領域の一番上のウィンドウを 1 秒に 1 回ポーリングするタイマーがあります。

var topMostHandle = WindowFromPoint((int)(Left + ActualWidth / 2), (int)ActualHeight / 2);

if (topMostHandle != new WindowInteropHelper(this).Handle)
{
    Topmost = false;
    Topmost = true;
}

したがって、基本的には、ツールバーの真ん中にポイントを取り、ツールバーが上にあるかどうかをテストします。そうでない場合は、TopMost を false に設定して true に戻すと、アクティブ化せずにトップに戻るようです。一瞬消える閃光が少し気になるが、そう頻繁には起こらないと思う。

問題に対処する Win7 SP1 のホットフィックスを見つけてくれた Hans Passant の功績: http://support.microsoft.com/kb/2733420

クライアントが回避策としてホットフィックスを実行できない/実行していない場合に備えて、ハックをコードに残しました。

于 2013-04-26T01:30:17.533 に答える