【问题标题】:Drawing on the Desktop using C#使用 C# 在桌面上绘图
【发布时间】:2016-02-05 06:27:49
【问题描述】:

我正在尝试使用 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);
        }
    }
}

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

【问题讨论】:

    标签: c# winforms gdi+ desktop system.drawing


    【解决方案1】:

    可能窗口会刷新您的屏幕,这就是您在屏幕上看不到矩形的原因。

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

    按照@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);
            }
    

    当你的表单被重新绘制时,这将使矩形在你的屏幕上被重新绘制。但是请记住,当窗口刷新屏幕时,您在屏幕上的绘图将消失。

    编辑: draw on screen without form 这里也有一篇很好的帖子,它提出了使用无边界表单的替代解决方案。

    【讨论】:

    • 无边界方式有效,但我还是很好奇为什么第一种方式不生效。我在 Form1_Paint 中移动代码并在其上添加侦听器。但是还是什么都没看到:(最后感谢您的回复!
    【解决方案2】:

    您不需要为此导入 DLL。使用表单绘制事件并像这样获取图形对象:

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

    【讨论】:

    • 我想直接在windows桌面上画画。反正有没有在 C# 中达到这个目标?谢谢你的回复。
    猜你喜欢
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 2011-02-23
    相关资源
    最近更新 更多