c # - Er der mulighed for at tage et skærmbillede af brugerens Windows-skrivebord?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil give brugeren et nedskaleret skærmbillede af skrivebordet i min ansøgning.


Er der mulighed for at tage et skærmbillede af den aktuelle brugeres Windows-skrivebord?


Jeg skriver i C #, men hvis der er en bedre løsning på et andet sprog, er jeg åben for det.


For at afklare, jeg har brug for et skærmbillede af Windows Desktop - det er kun tapet og ikoner, ingen programmer eller noget, der har fokus.

Bedste reference


Du er på udkig efter Graphics.CopyFromScreen. Opret en ny Bitmap af den rigtige størrelse og videregive Bitmaps grafikobjektkoordinater for regionen til kopiering. [4]


Der er også en artikel, der beskriver, hvordan man programmatisk tager snapshots. [5]


Svar til redigering : Jeg misforstod hvad du mente med 'desktop'. Hvis du vil tage et billede af skrivebordet, skal du:



  1. Minimer alle vinduer ved hjælp af Win32API (send en MIN\_ALL besked) først

  2. Tag et øjebliksbillede

  3. Løs derefter minimer alle (send en MIN\_ALL\_UNDO besked).






En bedre måde at gøre dette på ville ikke forstyrre de andre vinduer, men at kopiere billedet direkte fra skrivebordet vinduet. GetDesktopWindow i User32 vil returnere et håndtag til skrivebordet. Når du har vindueshåndtaget, skal du få det ens kontekst og kopiere billedet til en ny Bitmap. [7]


Der er et glimrende eksempel på CodeProject af, hvordan du kopierer billedet fra det. Se efter prøvekode om at få og oprette enhedens kontekst i afsnittet 'Capturing the window content'. [8]

Andre referencer 1


Jeg får indtryk af, at du skyder for at tage et billede af det egentlige skrivebord (med tapet og ikoner), og intet andet.


1) Ring ToggleDesktop () i Shell32 ved hjælp af COM

2) Brug Graphics.CopyFromScreen til at kopiere det aktuelle skrivebordsområde

3) Ring ToggleDesktop () for at gendanne tidligere desktop tilstand


Rediger: Ja, kald MinimizeAll () er krigsførende.


Her er en opdateret version, som jeg piskede sammen:


    /// <summary>
    /// Minimizes all running applications and captures desktop as image
    /// Note: Requires reference to "Microsoft Shell Controls and Automation"
    /// </summary>
    /// <returns>Image of desktop</returns>
    private Image CaptureDesktopImage() {

        //May want to play around with the delay.
        TimeSpan ToggleDesktopDelay = new TimeSpan(0, 0, 0, 0, 150);

        Shell32.ShellClass ShellReference = null;

        Bitmap WorkingImage = null;
        Graphics WorkingGraphics = null;
        Rectangle TargetArea = Screen.PrimaryScreen.WorkingArea;
        Image ReturnImage = null;

        try
        {

            ShellReference = new Shell32.ShellClass();
            ShellReference.ToggleDesktop();

            System.Threading.Thread.Sleep(ToggleDesktopDelay);

            WorkingImage = new Bitmap(TargetArea.Width,
                TargetArea.Height);

            WorkingGraphics = Graphics.FromImage(WorkingImage);
            WorkingGraphics.CopyFromScreen(TargetArea.X, TargetArea.X, 0, 0, TargetArea.Size);

            System.Threading.Thread.Sleep(ToggleDesktopDelay);
            ShellReference.ToggleDesktop();

            ReturnImage = (Image)WorkingImage.Clone();

        }
        catch
        {
            System.Diagnostics.Debugger.Break();
            //...
        }
        finally
        {
            WorkingGraphics.Dispose();
            WorkingImage.Dispose();
        }

        return ReturnImage;

    }


Juster til smag for flere skærmscenarier (selv om det lyder som dette, skal det fungere fint for din ansøgning).

Andre referencer 2


Du kan se på at bruge GetDesktopWindow gennem p/påkalde, så få enheden kontekst og tag et øjebliksbillede. Der er en meget detaljeret vejledning her. Det kan være bedre end at forstyrre de eksisterende vinduer. [9] [10]

Andre referencer 3


Alle tidligere svar er helt forkerte ( minimering af apps er absurde )
Brug simpelthen SHW api: en linje kode (desktop bitmapet bliver cachelagret, api blot blits det til din HDC ...)

Andre referencer 4


Du kan altid fange screenshot på Windows-opstart, før programmer kører
eller brug andet skrivebord ved at bruge skifte til skrivebordet. Se her:
http://www.codeproject.com/Articles/7666/Desktop-Switching
Skift til andet skrivebord, tag billedet og husk at du ikke behøver at vise det bare oprette det 'DESKTOP' [11]