具有透明背景的Windows表单,可以通过

时间:2017-01-12 22:25:36

标签: c# .net vb.net winforms sharpdx

引言

使用C#或VB.NET。我试图让表单的背景透明化;这个表单将叠加到其他窗口,它将是最顶层的窗口,因此透明表单(及其控件)必须具有不能获得焦点的能力,并且必须可以单击它们,这意味着如果例如我在透明背景上执行左键单击,然后在背景上的窗口(在Z顺序窗口中)是必须接收点击的窗口。

注意:

为了避免焦点,我按照here解释覆盖CreateParams属性。

为了使我的表单透明,我正在调用Win32 DwmExtendFrameIntoClientArea函数,并使用SharpDX库解释here。但我认为这对问题本身并不重要。

问题

我将展示我使用图像的意思。下面是与文本编辑器程序窗口重叠的表单图像(没有透明度,只是为了简化理解);请注意,我的表单没有得到关注。好吧,问题是当我点击表格的背景(或其中一个控件)时,背景窗口(文本编辑器窗口)仍然有焦点,但它无法接收到点击。

enter image description here

以上是与上面相同但透明的图片:

enter image description here

研究

我不确定要调查什么,所以我通过覆盖Window程序( WndProc )用于测试相关Windows消息的透明表单,如WM_NCHITESTWM_MOUSEACTIVATE消息,如下所示:

2 个答案:

答案 0 :(得分:0)

在Visual Studio中检查RAD设计器。

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

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

答案 1 :(得分:0)

您可以使用WinAPI通过在透明窗口下方的窗口中发送单击(向上和向下鼠标)消息来实现此目的。

PostMessageA

您需要在所需位置下方找到一个窗口。

WindowFromPoint

由于消息是根据相对窗口位置而不是绝对屏幕位置处理的,因此您必须相应地转换单击事件的位置。

很多年前,我实际上很成功地完成了自动玩Facebook游戏。