在没有形式的情况下在屏幕上绘制

38

不使用Windows窗体应用程序,可以在屏幕上创建一个大的白色矩形吗?

如果可能的话,矩形应覆盖整个屏幕。 我知道必须使用System.Drawing,并尝试了几个步骤,但实际上没有在我的屏幕上打印任何内容!


1
你是在问如何在控制台窗口之外绘图吗? - Tharwen
@Tharwen 是的,我指的就是那个。 - user1988147
2个回答

74

方法1:调用Windows API

您需要使用System.DrawingSystem.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);

这种方法的问题在于,如果屏幕有任何刷新,矩形就会被覆盖,使其对大多数实际应用程序无用。

方法2:创建无边框窗体

和之前一样,您需要一个项目引用。这次是 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从窗口切换到其他应用。如果您想执行任何更复杂的图形操作,则需要编写一些绘图代码,例如此处所示。要使表单背景透明,请将其TransparentKey设置为与BackColor相同。

我刚在.NET 4.5和Windows 7中测试了这两个功能,所以在早期版本中可能会有所不同。更多信息请参见此处此处


我该如何绘制到另一个屏幕上呢?(例如,不是主屏幕的第二个屏幕) - mekb
3
抱歉,已经过去6年了,我记不得了。 - Tharwen
@facepalm42 GetDC(0) 返回所有监视器的 DC。也许这可以解决你的问题:https://stackoverflow.com/a/53334112/1303323 - Stelios Adamantidis

6

是的,可以在屏幕上绘制内容,但使用一个最上层的无边框窗体可能更容易。

如果必须要在控制台应用程序中实现此功能,也可以通过引用必要的程序集来完成,但这将导致控制台窗口在应用程序运行期间一直保留在屏幕上。

this.TopMost = true;
this.FormBorderStyle = FormBorderStyle.None;

或者我认为您可以创建Window的实例并在其中调用Show

这个回答解释了如何使用GDI +调用直接绘制到屏幕。


谢谢你到目前为止的帮助,但我想在控制台窗口之外绘制这个。 - user1988147

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接