代码之家  ›  专栏  ›  技术社区  ›  Christopher Edwards

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

  •  9
  • Christopher Edwards  · 技术社区  · 16 年前

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

    首先,我使用了一个始终在顶部的窗口,将窗口样式设置为“无”,并将背景和透明度键设置为白色。在这个窗口上有一个大字体的标签,其中包含警报消息(稍后我可能会覆盖paint事件并使用gdi绘制消息)。我用一个计时器在重新拨号之前,通过拨号来淡化信息的不透明度。它可以正常工作,因为焦点不会从任何应用程序中被窃取,但透明窗体捕获鼠标事件,而不是其下的窗体(实际上,大多数透明窗体不会捕获鼠标事件,只有标签文本会捕获)。

    我也不确定这是最佳的方法,也许我应该直接在屏幕上画画。

    我该如何改进。

    1 回复  |  直到 16 年前
        1
  •  10
  •   Martin Plante    16 年前

    重写窗体类上的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,