Как нарисовать прямо на рабочем столе Windows, C #? - PullRequest
14 голосов
/ 08 октября 2009

Этот вопрос был задан для других языков, и даже для этих других языков я обнаружил, что в их ответах не хватает того, как именно это сделать, чисто (без перерисовок на экране и т.д.).

Можно ли рисовать на рабочем столе Windows из C #? Я ищу пример, если это возможно.

Ответы [ 3 ]

25 голосов
/ 08 октября 2009

Попробуйте следующее:

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);
    }
}
8 голосов
/ 08 октября 2009

Вы можете попробовать:

Graphics.FromHwnd(IntPtr.Zero)
3 голосов
/ 08 июня 2016

Вы можете увидеть пример реального кода в https://uiautomationverify.codeplex.com/SourceControl/latest#UIAVerify/Tools/visualuiverify/utils/screenrectangle.cs

Рисует прямоугольник, который будет отображаться на экране до тех пор, пока пользователь не решит удалить его в произвольной позиции (перекрашивать не будет). Он использует форму окна, которая скрыта / отображается как всплывающее окно.

Это код инструмента UIAVerify.exe в текущем Windows SDK.

Если вы хотите использовать вышеизложенное, скопируйте следующие файлы в ваш проект:

  • utils\screenboundingrectangle.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;
        }
    }
}

и

var rect = Rectangle.FromLTRB(100, 100, 100, 100);
var hi = new Highlighter();
hi.DrawRectangle(rect);
...