使用 C# 在桌面上绘图

Drawing on the Desktop using C#

我正在尝试使用 C# 在桌面上绘制一个矩形。在找到一些解决方案后,我得到了这些:

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace Test
{
    public partial class Form1 : Form
    {
        [DllImport("User32.dll")]
        public static extern IntPtr GetDC(IntPtr hwnd);
        [DllImport("User32.dll")]

        static extern int ReleaseDC(IntPtr hwnd, IntPtr dc);
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            myFunc();
        }

        public void myFunc()
        {
            IntPtr desktop = GetDC(IntPtr.Zero); 
            using (Graphics g = Graphics.FromHdc(desktop))
            {
                g.FillRectangle(Brushes.Red, 0, 0, 100, 100);
            }
            ReleaseDC(IntPtr.Zero, desktop);
        }
    }
}

但是当我 运行 它时,我的屏幕上什么也没有。谁能帮我找出是哪部分出了问题?将不胜感激!

您不需要为此导入 DLL。使用表单绘制事件并获取图形对象,如下所示:

private void Form1_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.DrawRectangle(new Pen(Color.Black,3),x,y,width,height);
}

可能 windows 会刷新您的屏幕,这就是为什么您在屏幕上看不到矩形的原因。

以下建议可能不是完美的解决方案,但它可能会帮助您使代码正常工作。

按照@vivek verma 的建议向您的表单添加一个绘制处理程序,并将您的代码移入此绘制处理程序

private void Form1_Paint(object sender, PaintEventArgs e)
        {
            IntPtr desktop = GetDC(IntPtr.Zero);
            using (Graphics g = Graphics.FromHdc(desktop))
            {
                g.FillRectangle(Brushes.Red, 0, 0, 100, 100);
            }
            ReleaseDC(IntPtr.Zero, desktop);
        }

当您的表单被重新绘制时,这将使矩形在您的屏幕上被重新绘制。但还是要记住,当windows.

刷新屏幕时,你在屏幕上的绘图就会消失

编辑: 这里 draw on screen without form 也有一个很好的 post 建议使用无边框形式的替代解决方案。