具有透明背景且能够点击穿透的Windows窗体

10

介绍

使用C#或VB.NET,我正在尝试使窗体的背景透明。此窗体将重叠到其他窗口上,它将是最顶层的窗口,因此透明窗体(及其控件)必须具有它们不能接收焦点且必须可以透过点击的能力。这意味着,例如,如果我在透明背景上执行左键单击,则位于Z-order窗口中的背景窗口是必须接收该单击的窗口。

注:

为了避免焦点,我正在覆盖CreateParams属性,如此处所述。

要使我的窗体透明,我调用Win32 DwmExtendFrameIntoClientArea函数,还使用SharpDX库,如此处所述。但我认为这实际上与问题本身无关。

问题

下面的图像显示了一个没有透明度的窗体(仅为简化理解),它与文本编辑器程序的窗口重叠。请注意,我的窗体不会接收焦点。问题在于,当我单击窗体的背景(或其控件之一)时,背景上的窗口(文本编辑器窗口)仍然具有焦点,但无法接收单击。

输入图像说明

下面是具有透明窗体的相同图像:

输入图像说明

研究

我不确定要研究什么,所以我正在盲目地尝试通过覆盖透明表单的窗口过程(WndProc)来寻找一些有用的内容,测试相关的窗口消息,比如像WM_NCHITEST或者WM_MOUSEACTIVATE等消息,正如这篇文章所说:


6
这是你正在寻找的东西吗?链接 - Reza Aghaei
1
还是这个?(阅读答案中的注释部分以启用或禁用点击) - Reza Aghaei
@Reza Aghaei 非常感谢,欢迎您发布答案以提高声誉。解决方法是通过重写 CreateParams 来设置这些扩展样式,并将窗体不透明度设置在 1% 到 99% 的范围内(0.01R 到 0.99R);我发现使用这种方法,窗体无法完全不透明,如果您让窗体保持默认值(即 100% 不透明),窗体将会显示为透明的... 真的,一切都会完全透明,所以窗体及其控件将完全消失,但是在 99% 不透明度下它将完美地工作... 这是一件奇怪的事情。 - ElektroStudios
怎么样让你的表单变得更短一些? - TGamer
@ElektroStudios,由于我不确定您的要求,所以我更倾向于只留下评论。请根据我分享的其他链接自由发表答案 :) - Reza Aghaei
或者您可以利用窗体的“TransparencyKey”属性。 - preciousbetine
2个回答

1
你可以使用WinAPI向透明窗口下面的窗口发送点击(鼠标上下)消息来实现这一点。

PostMessageA

您需要找到所需点下方的窗口。

WindowFromPoint

您需要相应地转换点击事件的位置,因为消息是基于相对窗口位置而不是绝对屏幕位置进行处理的。

我几年前曾经成功地使用这种方法自动玩Facebook游戏。


0

在Visual Studio中检查RAD设计器。

  • 标签是否停靠以填充?
  • 主表单可点击的位置在哪里?

透明颜色在主父级中是可点击的,但组件仍将保留点击。


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