在没有形式的屏幕上画画

use*_*147 27 c# console drawing

只使用C#控制台而不是C#Forms应用程序,是否可以在屏幕上创建一个大的白色矩形?

如果可能,它应覆盖整个屏幕.我知道我必须使用System.Drawing并尝试了几个步骤,但没有人会在我的屏幕上打印任何东西!

Tha*_*wen 53

方法1:调用Windows API

你需要System.DrawingSystem.Runtime.InteropServices.您可能需要向它们添加项目引用.

using System.Runtime.InteropServices;
using System.Drawing;
Run Code Online (Sandbox Code Playgroud)

使用P/Invoke将方法添加到您的类中

[DllImport("User32.dll")]
public static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("User32.dll")]
public static extern void ReleaseDC(IntPtr hwnd, IntPtr dc);
Run Code Online (Sandbox Code Playgroud)

获取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);
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于,如果屏幕完全刷新,矩形将被覆盖,这对大多数实际应用来说都是无用的.

方法2:创建无边框表单

和以前一样,您需要一个项目参考.这一次来System.Windows.Forms.你还需要System.Drawing再次:

using System.Drawing;
using System.Windows.Forms;
Run Code Online (Sandbox Code Playgroud)

制作新表单,删除其边框,用它填充屏幕,并将其放在任务栏的顶部:

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);
Run Code Online (Sandbox Code Playgroud)

一个可能的问题是用户只能远离窗口alt + tab.如果你想做更复杂的图形,你需要写一些像这样的绘图代码.要使表单背景透明,请将其设置TransparentKey为与其相同Backolor.

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

  • @facepalm42 抱歉,已经六年了。我不记得了 (2认同)

Pau*_*ane 6

是的,可以绘制到屏幕上,但使用最顶部的无边框形式可能更容易.

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

this.TopMost = true;
this.FormBorderStyle = FormBorderStyle.None;
Run Code Online (Sandbox Code Playgroud)

或者我相信你可以创建一个实例Window并调用Show它.

这个对不同问题的回答解释了如何使用GDI +调用直接绘制到屏幕上.