2009-10-08 10 views
14

To pytanie zostało zadane dla innych języków, a nawet dla tych innych języków, znalazłem ich odpowiedzi brak w jak dokładnie to zrobić, czyściutko (żadnych pomieszanych powtórzeń ekranu itp.).Jak narysować bezpośrednio na pulpicie systemu Windows, C#?

Czy można rysować na pulpicie systemu Windows z C#? Jeśli to możliwe, szukam przykładu.

+7

Nie ma oficjalnie wspierany czystą drogę do rysowania w oknie na pulpicie z dowolnego języka. W praktyce większość metod, które są najbardziej zbliżone do rysowania na pulpicie, polega na wstrzyknięciu własnej biblioteki DLL do procesu Eksploratora i podklasowaniu procedury okna okna pulpitu. Nie polecałbym jednak robić tego w języku C#. Ponadto nie ma gwarancji, że takie metody będą nadal działać w przypadku przyszłych wersji systemu Windows lub przyszłych dodatków Service Pack lub poprawek dla istniejących wersji systemu Windows. –

Odpowiedz

25

Spróbuj wykonać następujące czynności:

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

FYI dla tych, którzy mówią, że nie możesz, działało to dla mnie, chociaż przeniesienie dowolnego okna nad nim odświeża go natychmiast :( – esac

+0

Właśnie próbowałem tego w aplikacji WPF, C# 4.0 i otrzymałem "PInvokeStackImbalance został wykryty" jak tylko przesunąłem mysz po jej uruchomieniu, po prostu FYI dla innych, którzy przechodzą przez: – Alex

+0

Mam ten sam niezbalansowany błąd w stosie Co to jest zmiana? Zmień swój projekt z powrotem na 3.5 profil klienta? :) – gonzobrains

8

Można spróbować:

Graphics.FromHwnd(IntPtr.Zero) 
+2

Odpowiedź Paola Tedesco była dla mnie odpowiednia, ale zatrzymał się i nie mogłem zrozumieć dlaczego. Odpowiedź Leppie'ego sprawiła, że ​​znowu zadziałało. – chrismead

+0

Migocze, jeśli wstawię to do licznika czasu, aby zapobiec zniknięciu rysunku ... – beppe9000

3

można zobaczyć przykład kodu w świecie rzeczywistym w ciągu https://uiautomationverify.codeplex.com/SourceControl/latest#UIAVerify/Tools/visualuiverify/utils/screenrectangle.cs

Rysuje prostokąt, który pojawi się na ekran, dopóki użytkownik nie zdecyduje się go usunąć w dowolnej pozycji (nie będzie odświeżany). Używa formularza okna, który jest ukryty/pojawia się jako popup. To jest kod za narzędziem UIAVerify.exe w bieżącym zestawie Windows SDK.

Jeśli chcesz korzystać z powyższego, skopiuj następujące pliki do projektu:

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

może wymagać zaktualizowania nazw odpowiednio + dodaj referencje do System.Drawing + System.Windows.Forms

Następnie można narysować prostokąt z następującego kodu:

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

i

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