0

こんにちは、ガラスのような透明なフォームを取得しようとしていました。これにより、クリックスルーとすべてのマウスイベントがガラスの背後のウィンドウまたはアイテムに渡されます。

だから、これは私が WindowForms で書いたコードです:

namespace ClickThroughMe
{
public partial class ClickThroughForm : Form

{
    private int currentWindowStyle;

    public ClickThroughForm()

    {
        InitializeComponent();
    }

    private void ClickThroughForm_Load(object sender, EventArgs e)

    {
        // Grab the Extended Style information for this window and store it.

        currentWindowStyle = WindowLibrary.User32Wrappers.GetWindowLong(this.Handle, User32Wrappers.GWL.ExStyle);

        // Set our window to "transparent", or invisible to the mouse.

        SetFormToTransparent();

        // Make our window the top-most form.

        this.TopMost = true;       
    }

    private void SetFormToTransparent()

    {
        // This creates a new extended style for our window, making it transparent to the mouse.

        User32Wrappers.SetWindowLong(this.Handle, User32Wrappers.GWL.ExStyle,

                                    (User32Wrappers.WS_EX) currentWindowStyle | 

                                     User32Wrappers.WS_EX.Layered |

                                     User32Wrappers.WS_EX.Transparent);
    }
  }
}

このコードの問題は、不透明度によってウィンドウ全体が透明になるが、ボタンやスライダーなどのコントロールはクリック可能性を保持しないことです。

だから私はそれをより良くするために助けが必要です。

1)コントロールを完全に不透明にする(必要ではないが重要)

2)コントロールのクリック可能性と操作性を維持する(MUST)

結果を得るのに役立つ場合は、プロジェクトを WPF に変更することもできます。

ありがとうございました。

4

1 に答える 1

1

フォームの BackColor と一致するように、ClickThroughFormのForm.TransparencyKey プロパティを設定してみてください。

ClickThroughForm が別の Form で TopMost に設定されているときにこれをテストし、Button イベントを発生させることができ、TrackBar コントロールが正しく機能しているように見えました。

注:このメソッドを使用すると、透明性のために ClickThroughForm でマウス イベントをキャプチャできません。これが要件である場合は、この回答を無視できます。

ClickThroughForm クラス

public class ClickThroughForm : Form
{
    private System.ComponentModel.IContainer components = null;

    public ClickThroughForm()
    {
        InitializeComponent();
    }

    private void InitializeComponent()
    {
        this.SuspendLayout();
        // 
        // ClickThroughForm
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(300, 300);
        this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
        this.Name = "ClickThroughForm";
        this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
        this.Text = "ClickThroughForm";

        //Set the TransparencyKey to match the default BackColor of the Form
        this.TransparencyKey = System.Drawing.SystemColors.Control;

        this.ResumeLayout(false);

    }

    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }
}

これがお役に立てば幸いです。

あなたが新しいユーザーであることに気付きました. このサイトで質問したり、他の質問で探している答えが得られたりした場合は、忘れずに答えを受け入れてください.

詳細については、次を参照してください。回答の受け入れはどのように機能しますか?

于 2011-09-03T00:27:15.870 に答える