【发布时间】:2020-11-17 10:44:54
【问题描述】:
我已经使用以下代码加载了一个 Winform,具有半透明效果。
frmTest frm=new frmTest();
frm.Opacity = 0.051;
frm.Left = 0;
frm.Top = 0;
frm.Width= Screen.PrimaryScreen.Bounds.Width;
frm.Height= Screen.PrimaryScreen.Bounds.Height;
frm.Show();
现在我正在寻找某种方法来绕过我的表单以响应鼠标点击。例如,表单以半透明方式显示在桌面上,用户单击表单,桌面应该获得鼠标点击而不是我的表单。我的表单只需要对用户可见,但不会与它发生冲突。
我尝试禁用我的表单,但不知道如何将鼠标事件传递到我的表单下方的桌面或其他程序。有人可以指出我正确的方向来解决这个问题吗?
【问题讨论】:
-
检查这个线程:stackoverflow.com/a/11043661/2109769 他们使标签半透明,同样的事情可能适用于表单。
-
@Quercus 我这样试过。它获取 API 调用但不绕过鼠标事件。公共类转换:表格{私有常量int WM_NCHITTEST = 0x84;私有 const int HTTRANSPARENT = -1; protected override void WndProc(ref Message message) { if (message.Msg == (int)WM_NCHITTEST) message.Result = (IntPtr)HTTRANSPARENT;否则 base.WndProc(参考消息); } }
-
你没有提到这个表单的用途。用户应该与之交互吗?它有什么作用?如果它不需要做任何特定的事情,它只是叠加排序,您可以使用每像素 Alpha 分层形式 - 将
WS_EX_TRANSPARENT添加到样式中 - 并在其表面上绘制图像。表单现在不可触摸,即使它看起来像有一个表面,一切都会通过。如果您只需要表单的框架并且 ClientArea 可以是透明的,请使用红色的 TrasparencyKey 颜色(洋红色是特殊)。 -
@Jimi 我的表单包含一些控件,可以及时更新一些信息,并且它们中的任何一个都不是用户难以处理的。仅用于显示结果和一些小动画。我无法执行诸如反向缓冲之类的操作,因为我的表单只会在可见屏幕区域正确加载其内容。
-
我描述的这两种方法都会给你。 1) 分层透明表单不能以任何方式进行交互,但它不能在其表面上显示控件:您必须在位图上绘制您想要显示的内容,然后在表单的表面上绘制位图(您只能更新位图的一部分)。 2) 使用 BackgroundColor + TransparencyKey 设置为 Magenta,您有一个带有完全透明 ClientArea 的表单,可以点击。您可以在表单的表面上拥有控件,并且可以根据需要与这些控件进行交互。
标签: c# forms winforms click mouseevent