繁体   English   中英

C#表格中的点击

[英]Click-through in C# Form

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

您可以使用SetWindowLong执行此操作:

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

这里有一些神奇的数字:

  • -20GWL_EXSTYLE

    检索扩展的 window styles。

  • 0x80000WS_EX_LAYERED

    创建一个分层的 window

  • 0x20WS_EX_TRANSPARENT

    指定使用此样式创建的 window 不应该被绘制,直到 window(由同一线程创建)下方的兄弟姐妹已被绘制。 window 看起来是透明的,因为底层兄弟 windows 的位已经被绘制。

web 上有很多关于如何执行此操作的文章,例如这篇文章。

@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;
        }
    }
}

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

上面的解决方案与这篇文章类似,它使表单成为最顶层的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM