3

画面全体にフルスクリーンオーバーレイを作成しようとしています。これにより、画面全体の色/彩度などが変更され、テキストと効果が追加されます。基本的には、ユーザーが Windows と正常にやり取りできるようにしながら、画面全体を「置き換え」たいと考えています。

解決策 1

ただし、問題は、単純にTopMost画面全体にウィンドウを作成すると、ユーザーはこのウィンドウの下にあるものと対話できなくなることです。

解決策 2

デスクトップ バッファに描画するだけでは、問題は解決しません。ウィンドウが移動すると厄介な効果が発生し、重いモーション ブラー効果も発生します。これは決して見栄えがよくありません。

解決策 3

「デスクトップ描画イベント」をフックすることは、DLL を explorer.exe に挿入する必要があるため、C# では不可能です。これはまったく適切な解決策ではなく、C# では機能しません。また、ウイルス対策プログラムは、それを有害なものとして検出する可能性があります。


私が見た最も近いものはこれでしたが、ユーザーはオーバーレイを「クリックスルー」できません。この例では、オーバーレイはほとんど完全に透明です。透過キー以外の色を使用すると、解決策 1の問題が発生します。

質問:画面全体にエフェクトを効果的に重ねるにはどうすればよいですか?

4

1 に答える 1

0

未テスト

あなたの問題はクリックしているようです。マウス メッセージを通過させるために、トップ ウィンドウでのマウス クリックを傍受し (これが透明なウィンドウに設定されていると仮定)、ウィンドウを非表示にし、user32 import SendMessage を使用して同じマウス メッセージを起動することを検討しましたか?もう一度ウィンドウを表示しますか?ウィンドウを非表示にしたくない場合は、SendMessage を他のさまざまなウィンドウ ハンドルに直接呼び出すことができます。

次のリンクは、アプリケーションのデスクトップ上のウィンドウを切り替える方法を示しています。

http://support.microsoft.com/kb/183009

フォームを既に透明にしている場合は、CreateParams をオーバーライドすることもできると思います。これにより、マウス イベントが通過する可能性があります。

// This may be even simpler
protected override CreateParams CreateParams
{
    get
    {
        CreateParams createParams = base.CreateParams;
        createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT

        return createParams;
    }
}

次のような新しい Windows フォームでは、フォーム自体を透明にすることができます。

public void MakeSeeThru()
{
   frmTransparentForm.Opacity = 0.83;
}

上記は Form でのみ機能します。子コントロールでこれを行うには、より多くの作業が必要です。最初に、透明な背景色をサポートするようにスタイルを設定する必要があります。

public TransparentControl()
{
    SetStyle(ControlStyles.SupportsTransparentBackColor, true);
    this.BackColor = Color.Transparent.
}

コントロールが透過的である場合でも、OnPaintBackground および OnPaint メソッドをオーバーライドして、必要に応じてカスタム描画を行うことができます。デフォルトをシースルー背景として描画するだけです。

以前にこれを行ったことがありますが、これが動き回ると少しぼやけます。ただし、全体がデスクトップを覆う巨大な透明なフォームである場合、モーション ブラーは発生しません。

パフォーマンスの問題があり、デスクトップをカスタム描画したい場合は、次のようなスクリーンショットを取得できます。

ScreenCapture sc = new ScreenCapture();
// capture entire screen, and save it to a file
Image img = sc.CaptureScreen();

ただし、最初にフォームを非表示にする必要があるため、ちらつきが発生する可能性があります。

于 2013-07-19T17:08:40.937 に答える