透明窗口(或绘制到屏幕)无鼠标捕获

时间:2008-11-25 18:07:51

标签: .net winforms

在我正在编码的应用程序中,我想要显示一条警告消息,显示一条大的半透明警告消息,而不会影响用户的工作。基本上我会淡化消息,但从不将它的不透明度设置为1,我希望用户能够点击“通过”消息,就好像它不存在一样。

我已经开始使用一个永远在顶部的窗口并将窗口样式设置为none并将背景和透明度键设置为白色。在这个窗口中有一个带有大字体的标签,其中包含警告消息(稍后我可能会覆盖绘制事件并使用GDI绘制消息)。我使用计时器通过拨打它的不透明度淡入消息,然后再次拨回它。它工作正常,因为焦点不是从任何应用程序中窃取,但透明表单捕获鼠标事件,而不是它下面的表单(实际上大多数透明形式不捕获鼠标事件,只有标签文本做)。

此外,我不确定这是最佳方法,也许我应该以某种方式直接画在屏幕上。

我应该如何改进。

1 个答案:

答案 0 :(得分:10)

覆盖Form类的CreateParams属性,并确保设置了WS_EX_NOACTIVATE扩展样式。我看起来像这样:

protected override CreateParams CreateParams
{
  get
  {
    CreateParams baseParams = base.CreateParams;

    baseParams.ExStyle |= ( int )(
      Win32.ExtendedWindowStyles.WS_EX_LAYERED |
      Win32.ExtendedWindowStyles.WS_EX_TRANSPARENT |
      Win32.ExtendedWindowStyles.WS_EX_NOACTIVATE |
      Win32.ExtendedWindowStyles.WS_EX_TOOLWINDOW );

    return baseParams;
  }
}

上面使用的ExtendedWindowStyles的值是:

WS_EX_LAYERED = 0x00080000,
WS_EX_NOACTIVATE = 0x08000000,
WS_EX_TOOLWINDOW = 0x00000080,
WS_EX_TRANSPARENT = 0x00000020,