C# 屏幕截图的屏幕覆盖

C# 屏幕截图的屏幕覆盖,c#,C#,我想通过C#在整个屏幕上覆盖一个灰色的半透明区域。这可以通过Windows窗体实现吗?我将如何实现这一点?当然,只需创建一个覆盖所有桌面屏幕的无边框半透明窗口即可 您可以找到用以下LINQ覆盖所有屏幕的右矩形: Rectangle bounds = Screen.AllScreens .Select(x => x.Bounds) .Aggregate(Rectangle.Union); 然后从边界

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

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

您可以找到用以下LINQ覆盖所有屏幕的右矩形:

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

然后从
边界设置窗口的左侧、顶部、宽度和高度

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

  • 最上面的,ShowInTaskBar,ControlBox,MaximizeBox,MinimizeBox:'错误
  • 文本属性:清除它
  • 我会在表单的加载事件中设置“变暗”表单的大小:如果我想处理多个监视器的情况,我会使用Rob答案中优雅的代码来设置添加到项目中的表单的边界。如果我只想处理一台显示器,我会做一些简单的事情,比如:

        // in the Load Event of the "dim-out" Form
        this.Bounds = Screen.PrimaryScreen.Bounds;
    
    然后,当然,当您需要响应可见窗体上的任何内容时,您可以显示此“淡出”窗体

    显示“淡出”窗体将使其显示在应用程序的其他可见窗体的顶部(除非其中一个窗体设置了最顶层或顶层属性)

    但您可以实现的一个很好的效果是在显示MessageBox(或以模式显示的窗体)之前显示“dim out”窗体:这意味着您将“前面”显示MessageBox对话框(或模式窗体),后面的所有内容都“dim out”

    下面是显示“暗显”窗体的代码的外观:

        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”属性(在设计时未公开)并重新了解该属性如何影响屏幕上的表单顺序,以及检查“表单的最顶层属性(在设计时公开)。

    好的,我想知道如何做到这一点。我似乎无法创建一个无边框的窗口,每当我选择要“最大化”的窗体时,它都不会覆盖整个屏幕,并且忽略了底部的5个像素和右侧的10个像素。最大化可能不是您想要的。您希望窗口的大小与整个可见屏幕区域的大小相同(可能在所有屏幕上),您可以通过将
    FormBorderStyle
    属性设置为
    None
    使其无边界
    位置=边界位置