在没有表单的屏幕上绘制

问题描述 投票:31回答:3

是否可以在不使用表单应用程序的情况下在屏幕上创建一个大的白色矩形?

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

c# console drawing screen
3个回答
56
投票

方法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远离窗口。如果要制作更复杂的图形,则需要编写一些绘图代码,例如this。要使表单背景透明,请将其TransparentKey设置为与Backolor相同。

我刚刚在.NET 4.5和Windows 7中对这两者进行了测试,因此对于早期版本可能会有所不同。更多信息herehere


6
投票

是,可以在屏幕上绘制,但是使用最上面的无边界表单可能会更容易。

如果需要,您也可以从控制台应用程序执行此操作,前提是您引用了必要的程序集,但这会导致控制台窗口在应用程序的生命周期内仍保留在屏幕上。

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

或者,我相信您可以创建Window的实例并在其上调用Show

[This answer to a different question解释了如何使用GDI +调用直接绘制到屏幕上。


1
投票

我理解问题的方式,以任何有意义的方式实际上都是不可能的。我想您可以在平台上调用user32.dll和gdi32.dll并通过消息循环等方式实现经典的Windows UI应用程序,但是仅使用Forms会容易得多。您为什么不能这样做呢?

© www.soinside.com 2019 - 2024. All rights reserved.