【问题标题】:Screen Overlay For Screenshot屏幕截图的屏幕叠加
【发布时间】:2010-02-01 12:42:54
【问题描述】:

我想通过 C# 在整个屏幕上覆盖一个灰色的半透明区域。这可以通过 Windows 窗体实现吗?我将如何做?

【问题讨论】:

  • 嘿,也许你终于可以让那个该死的 UAC 提示有用了,如果你可以把你的窗口放在它的提示上......

标签: c#


【解决方案1】:

当然,只需创建一个覆盖所有桌面屏幕的无边框、半透明窗口即可。

您可以使用以下 LINQ 找到正确的 Rectangle 来覆盖所有屏幕:

Rectangle bounds = Screen.AllScreens
                       .Select(x => x.Bounds)
                       .Aggregate(Rectangle.Union);

然后从bounds设置窗口的Left、Top、Width和Height

【讨论】:

  • 对,我想知道该怎么做。我似乎无法创建无边框窗口,并且每当我选择要“最大化”的表单时,它都不会覆盖整个屏幕,并且会错过底部 5 个像素和右侧 10 个像素。
  • 最大化可能不是你想要的。您希望您的窗口与整个可见屏幕区域的大小相同(可能在所有屏幕上),您可以通过将FormBorderStyle 属性设置为None 使其无边界。
  • 这很好,我使用:Size = bounds.Size;Location = bounds.Location; 作为我的代码,但是,它不适用于非标准屏幕布局。就像 1 中的 2 一样,上面的内容只显示在一台显示器上,而不是同时显示。
【解决方案2】:

除了使用 Johannes 的建议将 'FormBorderStyle 属性设置为 'None 之外,我还将在此表单上设置以下属性以“调暗”屏幕:

  1. TopMost、ShowInTaskBar、ControlBox、MaximizeBox、MinimizeBox:'假
  2. 文本属性:清除它

我会在表单的 Load 事件中设置“变暗”表单的大小:如果我想处理添加到项目中的表单,我会使用 Rob 回答中的优雅代码来设置边界多显示器的情况。如果我只想处理一台显示器,我会做一些简单的事情,比如:

    // in the Load Event of the "dim-out" Form
    this.Bounds = Screen.PrimaryScreen.Bounds;

然后,当然,您可以在需要时显示此“变暗”表单,以响应可见表单上的任何内容。

显示“淡出”表单将使其显示在您的应用程序的其他可见表单之上(除非其中一个设置了 TopMost 或 TopLevel 属性)。

但是您可以实现的一个很好的效果是在显示 MessageBox(或模态显示的表单)之前显示您的“暗淡”表单:这意味着您将拥有 MessageBox 对话框(或模态表单)“前面”,后面的一切都“变暗”。

下面是显示“暗淡”表单的代码的样子:

    dimmedForm.Show();

    // change these to suit your taste or purpose
    // this.BringToFront();
    // dimmedForm.BringToFront();

    // example of showing a MessageBox over the dimmedForm
    // which will block the current thread
    MessageBox.Show("why not ?");

    // now hide the dimmedForm 
    dimmedForm.Hide();

您可能想查看 'TopLevel 属性(在设计时未公开)并刷新有关该属性如何影响屏幕上的表单顺序的知识,以及检查 'TopMost 属性一个表单(在设计时公开)。

【讨论】:

  • 我们需要一个“合并答案”功能:) (+1)
猜你喜欢
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多