创建一个半透明或透明的窗口 从透明到鼠标事件,除了添加到窗体的控件

Posted

技术标签:

【中文标题】创建一个半透明或透明的窗口 从透明到鼠标事件,除了添加到窗体的控件【英文标题】:Create a semi or transparent Window Form trasparent to mouse events except for Controls added to the form 【发布时间】:2011-11-09 13:24:56 【问题描述】:

您好,我试图获得一个像玻璃一样的透明表单,它可以使点击和每个鼠标事件都传递到玻璃后面的窗口或项目。

这是我用 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)保留控制可点击性和可操作性(必须)

我接受任何解决方案,甚至将项目更改为 WPF,如果这有助于获得结果。

感谢您的宝贵时间。

【问题讨论】:

【参考方案1】:

尝试设置 ClickThroughForm 的 Form.TransparencyKey Property 以匹配表单背景色。

当 ClickThroughForm 设置为 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);
    

希望对你有所帮助。

我注意到您是新用户,如果您在网站上提出的这个或任何其他问题提供了您正在寻找的答案,请记住接受答案。

有关更多信息,请参阅以下内容:How does accepting an answer work?

【讨论】:

令人惊奇的是,这是在我的眼皮底下,与我所做的不同之处在于,如果您将背景颜色设置为像紫色这样的颜色,然后使用紫色作为透明度键,它将不起作用它必须是 System.Drawing.SystemColors.Control 否则你不能通过它触发任何事件。它的问题是它是 100% 透明的(这对我的一个项目有好处,但对另一个项目没有好处),所以我希望得到半透明的结果。也许是用 Photoshop 中的图像创建的玻璃效果。 奇怪的是,它现在可以与使用不同颜色的新表单一起使用。可能有一些代码干扰了这个。

以上是关于创建一个半透明或透明的窗口 从透明到鼠标事件,除了添加到窗体的控件的主要内容,如果未能解决你的问题,请参考以下文章

如何让图片以半透明的效果显示在所有程序或窗口的最上层?

透明JPanel

求助,关于Qt的窗口半透明,窗口上的空间不透明

可以使用Xcode12的.command时如何让MacApp窗口背景透明或半透明

如何让窗口半透明,总在最前,但不接收输入?

Win32纯API创建半透明窗口