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