截屏的屏幕叠加

时间:2010-02-01 12:42:54

标签: c#

我想通过C#覆盖整个屏幕上的灰色半透明区域。这可以通过Windows Forms完成吗?我将如何做到这一点?

2 个答案:

答案 0 :(得分:8)

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

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

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

然后从bounds

设置窗口的左,顶部,宽度和高度

答案 1 :(得分:2)

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

  1. TopMost,ShowInTaskBar,ControlBox,MaximizeBox,MinimizeBox:'False
  2. 文字属性:清除它
  3. 我在Form的Load事件中设置了“dim-out”Form的大小:我会使用Rob的答案中的优雅代码来设置添加到项目中的Form的边界,如果我想处理多个监视器的情况。如果我只想处理一台显示器,我会做一些简单的事情:

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

    然后,当然,当您需要回复可见表格上的任何内容时,您可以显示此“暗淡”表格。

    显示“dim-out”表单将使其显示在Application的其他可见表单之上(除非其中一个表单设置了TopMost或TopLevel属性)。

    但是你可以实现的一个很好的效果就是在显示MessageBox(或模态显示的Form)之前显示你的“dim-out”表单:这意味着你将拥有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属性(在设计时未公开)并刷新您对该属性如何影响屏幕上的Form顺序的了解,以及检查'TopMost属性表格(在设计时暴露)。