3

OS でデュアルビュー設定を使用しています (2 つの画面にまたがる 1 つのビュー)。私のwinformsアプリケーションでは、特定のウィンドウをセカンダリスクリーンに移動できます。

foreach (Screen s in Screen.AllScreens)
{
    if (!s.Primary) {
        myform.Bounds = s.Bounds;
        break;
    }
}

この二次画面を見ることができれば、すべて問題ありません。表示された場合、そのようなウィンドウ フォームが提供する機能を使用できます。たとえば、適切なボタンをクリックしてウィンドウを閉じることができます。

しかし、このセカンダリ スクリーンが見えない場合はどうすればよいでしょうか。たとえば、これは別の部屋の壁に表示された投影画像です。見捨てられたフォームを使用することはできません。このような不快な状況にどのように対処しますか (同じ部屋に移動することはできません) ?

私が望むのは、そのようなフォームの正確な複製を作成して、プライマリ画面とセカンダリ画面の両方に表示することです。同じウィンドウの複数のインスタンス、正確なコピーが本当に欲しいです。1 つのインスタンスが他のインスタンスの変更を反映し、その逆も同様です。離れた場所にあるメイン画面を使用して、セカンダリ画面を制御できました (ポップアップ情報に反応するなど)。winformsを使用して.Netでこのようなものを実装する方法がわかりません。どうやってするの ?

ところで: これを達成するのが難しい場合、概念的な観点から何ができるでしょうか? いくつかのキーボード ショートカットを定義できることはわかっていますが、これは私が望んでいるものではありません。何か案は?

4

1 に答える 1

2

概念的には、2 番目のウィンドウ (「ミラー フォーム」と呼びます) を使用して、プライマリ フォームを複製できます。 プライマリ フォームの画面をキャプチャし、キャプチャした部分をミラー フォームに表示します。

その部分は簡単な部分です。ミラー フォームを実際に操作できるようにするには、マウスの移動、ホバー、クリック イベント、キーボード イベントなどのすべてのユーザー入力をキャプチャして、メイン フォームで再生する必要があります。

ミラー フォームのイベント ハンドラをすべてキャプチャしてプライマリ フォームで再生することにより、これを実行できる場合があります。ただし、ミラーフォームでメッセージをキャプチャすることを検討します。これはおそらくより包括的であり、イベントを「監視」してプライマリフォームに送信するためのコードの賢明な方法です。また、フォーカスを変更するミラー フォームに送信されるメッセージを「食べる」こともできます (たとえば、ユーザーがプライマリ フォームと対話していると考えているときに、入力フォーカスがプライマリ フォームからミラー フォームに突然移動すると、問題が発生する可能性があります)。 )。

Messages の詳細については、フォームの WndProc (実際にはControl.WndProc ) とhereのオーバーライドを調べてください。優れた概要記事は、Deliver The Power Of Spy++ To Windows Forms With Our New Toolです。また、関係のないクロスプロセス通信も扱いますが、メッセージとそれらのインターセプトに関する多くの詳細を説明しています。

于 2013-04-29T23:59:33.460 に答える