未テスト
あなたの問題はクリックしているようです。マウス メッセージを通過させるために、トップ ウィンドウでのマウス クリックを傍受し (これが透明なウィンドウに設定されていると仮定)、ウィンドウを非表示にし、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();
ただし、最初にフォームを非表示にする必要があるため、ちらつきが発生する可能性があります。