[英]Click-through in C# Form
我创建了一个半透明的表单。 我希望人们能够点击表单区域,并且表单不能处理点击。 我希望表单下方的任何内容都可以接收点击事件。
您可以使用SetWindowLong
执行此操作:
int initialStyle = GetWindowLong(this.Handle, -20);
SetWindowLong(this.Handle, -20, initialStyle | 0x80000 | 0x20);
这里有一些神奇的数字:
-20
– GWL_EXSTYLE
检索扩展的 window styles。
0x80000
– WS_EX_LAYERED
创建一个分层的 window 。
0x20
– WS_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.