Como desenhar diretamente na área de trabalho do Windows, c #?

Esta pergunta foi pedida para outros idiomas, e mesmo para aqueles outros idiomas, eu encontrei suas respostas faltando em como exatamente fazê-lo, de forma limpa (sem rebarbas na canvas desarrumada, etc.).

É possível desenhar na área de trabalho do Windows a partir do C #? Eu estou procurando um exemplo, se possível.

Tente o seguinte:

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); } } 

Podes tentar:

 Graphics.FromHwnd(IntPtr.Zero) 

Você pode ver um exemplo de código real em https://uiautomationverify.codeplex.com/SourceControl/latest#UIAVerify/Tools/visualuiverify/utils/screenrectangle.cs

Isso desenha um retângulo que aparecerá na canvas até que o usuário opte por removê-lo em uma posição arbitrária (não será repintado). Ele usa um formulário do windows que é oculto / aparece como um popup.

Este é o código por trás da ferramenta UIAVerify.exe no Windows SDK atual.

Se você quiser usar o acima, copie os seguintes arquivos em seu projeto:

  • utils\screenboundingrectangle.cs
  • utils\screenrectangle.cs
  • win32\*

Pode ser necessário atualizar namespaces adequadamente + adicionar referências a System.Drawing + System.Windows.Forms

Então você pode desenhar um retângulo com o seguinte código:

 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; } } } 

e

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