【发布时间】:2013-01-01 09:23:02
【问题描述】:
是否可以在不使用表单应用程序的情况下在屏幕上创建一个大的白色矩形?
如果可能,它应该覆盖整个屏幕。
我知道我必须使用System.Drawing 并尝试了几个步骤,但没有一个真正在我的屏幕上打印任何内容!
【问题讨论】:
-
您是否在寻求一种在控制台窗口外绘制的方法?
-
@Tharwen 是的,我是这个意思
是否可以在不使用表单应用程序的情况下在屏幕上创建一个大的白色矩形?
如果可能,它应该覆盖整个屏幕。
我知道我必须使用System.Drawing 并尝试了几个步骤,但没有一个真正在我的屏幕上打印任何内容!
【问题讨论】:
您需要System.Drawing 和System.Runtime.InteropServices。您可能需要向它们添加项目引用。
using System.Runtime.InteropServices;
using System.Drawing;
使用 P/Invoke 将方法添加到您的类中
[DllImport("User32.dll")]
public static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("User32.dll")]
public static extern void ReleaseDC(IntPtr hwnd, IntPtr dc);
为整个屏幕获取一个Graphics 对象并用它绘制一个矩形:
IntPtr desktopPtr = GetDC(IntPtr.Zero);
Graphics g = Graphics.FromHdc(desktopPtr);
SolidBrush b = new SolidBrush(Color.White);
g.FillRectangle(b, new Rectangle(0, 0, 1920, 1080));
g.Dispose();
ReleaseDC(IntPtr.Zero, desktopPtr);
这种方法的问题是,如果屏幕完全刷新,矩形就会被覆盖,这对于大多数实际应用来说毫无用处。
和以前一样,您需要一个项目参考。这次是System.Windows.Forms。你还需要System.Drawing:
using System.Drawing;
using System.Windows.Forms;
制作新的表单,去掉它的边框,用它填满屏幕,然后把它放在任务栏的顶部:
Form f = new Form();
f.BackColor = Color.White;
f.FormBorderStyle = FormBorderStyle.None;
f.Bounds = Screen.PrimaryScreen.Bounds;
f.TopMost = true;
Application.EnableVisualStyles();
Application.Run(f);
一个可能的问题是用户可以离开窗口只是 alt+tab。如果你想做更复杂的图形,你需要写一些绘图代码,比如this。要使表单背景透明,请将其TransparentKey 设置为与其Backolor 相同。
我刚刚在 .NET 4.5 和 Windows 7 中测试了这两个版本,因此早期版本可能会有所不同。更多信息here 和here。
【讨论】:
GetDC(0) 从所有监视器返回 DC。 也许这可以解决你的问题:stackoverflow.com/a/53334112/1303323
是的,可以在屏幕上绘制,但使用最顶部的无边框表单可能更容易。
如果必须,您也可以从控制台应用程序执行此操作,前提是您引用必要的程序集,但这会导致控制台窗口在应用程序的生命周期内保留在屏幕上。
this.TopMost = true;
this.FormBorderStyle = FormBorderStyle.None;
或者,我相信您可以创建一个Window 的实例并在其上调用Show。
This answer to a different question 解释了如何使用 GDI+ 调用直接在屏幕上绘图。
【讨论】: