如何直接在Windows桌面上绘制,C#?

如何直接在Windows桌面上绘制,C#?,c#,desktop,C#,Desktop,其他语言也有人问过这个问题,即使是那些其他语言,我也发现他们的答案缺乏准确、干净(没有混乱的屏幕重新绘制等) 是否可以从C#绘制到Windows桌面上?如果可能的话,我正在寻找一个例子。尝试以下方法: using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Runtime.InteropServices; class Program { [DllImport("User32.dl

其他语言也有人问过这个问题,即使是那些其他语言,我也发现他们的答案缺乏准确、干净(没有混乱的屏幕重新绘制等)

是否可以从C#绘制到Windows桌面上?如果可能的话,我正在寻找一个例子。

尝试以下方法:

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;

class Program {

    [DllImport("User32.dll")]
    static extern IntPtr GetDC(IntPtr hwnd);

    [DllImport("User32.dll")]
    static extern int ReleaseDC(IntPtr hwnd, IntPtr dc);

    static void Main(string[] args) {
        IntPtr desktop = GetDC(IntPtr.Zero);
        using (Graphics g = Graphics.FromHdc(desktop)) {
            g.FillRectangle(Brushes.Red, 0, 0, 100, 100);
        }
        ReleaseDC(IntPtr.Zero, desktop);
    }
}
您可以尝试:

Graphics.FromHwnd(IntPtr.Zero)

您可以在中看到一个真实的代码示例

这将绘制一个矩形,该矩形将显示在屏幕上,直到用户选择在任意位置删除它(不会重新绘制)。它使用隐藏/显示为弹出窗口的windows窗体

这是当前Windows SDK中
UIAVerify.exe
工具背后的代码

如果要使用上述文件,请将以下文件复制到项目中:

  • utils\screenbundingrectangle.cs
  • utils\screenrectangle.cs
  • win32\*
可能需要相应地更新名称空间+添加对
System.Drawing
+
System.Windows.Forms

然后可以使用以下代码绘制矩形:

namespace Something
{
    public class Highlighter
    {
        ScreenBoundingRectangle _rectangle = new ScreenBoundingRectangle();
        public void DrawRectangle(Rectangle rect)
        {
            _rectangle.Color = System.Drawing.Color.Red;
            _rectangle.Opacity = 0.8;
            _rectangle.Location = rect;
            this._rectangle.Visible = true;
        }
    }
}


没有官方支持的从任何语言在桌面窗口上绘制的干净方式。实际上,在桌面上实现最接近干净的绘图的大多数方法都涉及将自己的dll注入资源管理器进程,并为桌面窗口的窗口过程子类化。不过,我不建议在C#中这样做。此外,也不能保证这些方法会在任何未来版本的Windows上继续工作,或者在任何现有版本的Windows上继续使用任何未来的Service Pack或修补程序。仅供参考,对于那些说你不能的人,这确实对我有效,尽管移动任何窗口都会立即重新绘制:(我刚刚在一个WPF,C#4.0应用程序中尝试了这一点,启动鼠标后一移动鼠标,我就得到了“PinVokeStackDistancement West detected”。仅供路过的其他人参考。我得到了同样的不平衡堆栈错误。有什么解决方法?将项目更改回3.5客户端配置文件?:)将我的项目更改为.NET 3.5似乎消除了此不平衡问题。堆栈不平衡是由于ReleaseDC方法定义不正确造成的。它应该是:static extern int ReleaseDC(IntPtr hwnd,IntPtr dc)Paolo Tedesco的回答过去对我有用,但后来停了下来,我不明白为什么。Leppie的回答让我又能用了。
var rect = Rectangle.FromLTRB(100, 100, 100, 100);
var hi = new Highlighter();
hi.DrawRectangle(rect);