C#表单中的点击穿透

10

我创建了一个半透明表单。我希望人们能够点击表单区域,但不希望表单处理点击。我希望表单下方的任何内容都能够接收到点击事件。


可能是Visual C#窗体的透明点击穿透?的重复问题。 - Joey
表格下方会有什么? - Ikaso
2个回答

19

您可以使用SetWindowLong来实现此目的:

int initialStyle = GetWindowLong(this.Handle, -20);
SetWindowLong(this.Handle, -20, initialStyle | 0x80000 | 0x20);

这里有几个魔数:

  • -20GWL_EXSTYLE

    获取扩展窗口样式。

  • 0x80000WS_EX_LAYERED

    创建分层窗口

  • 0x20WS_EX_TRANSPARENT

    指定使用此样式创建的窗口在同一线程下创建的兄弟窗口未被绘制之前不应该被绘制。在其它同级窗口已经被绘制后,该窗口会立马出现透明效果。

网上有很多文章介绍如何实现这些功能,例如这篇文章


3

@Joey的回答中的SetWindowLong只能在屏幕上显示表单后使表单半透明。如果您在Form1_Load中调用SetWindowLong,则该表单将在创建时不透明,然后迅速变为半透明。这会导致用户在启动程序时短暂地看到非半透明表单。为了防止这种情况,您可以覆盖CreateParams

public partial class Form1 : Form
{
    protected override CreateParams CreateParams
    {
        get
        {
            const int WS_EX_LAYERED = 0x80000;
            const int WS_EX_TRANSPARENT = 0x20;
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= WS_EX_LAYERED;
            cp.ExStyle |= WS_EX_TRANSPARENT;
            return cp;
        }
    }
}

上述代码使表单在屏幕上显示之前半透明。

上述解决方案类似于此帖子,使表单处于最顶层。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接