Есть ли способ сделать снимок экрана рабочего стола пользователя Windows?

Я хочу предоставить пользователю уменьшенный снимок экрана своего рабочего стола в моем приложении.

Есть ли способ сделать снимок экрана текущего рабочего стола Windows?

Я пишу на С#, но если есть лучшее решение на другом языке, я открыт для него.

Чтобы уточнить, мне нужен скриншот рабочего стола Windows - что только обои и значки; нет приложений или чего-либо, что было сосредоточено.

Ответы

Ответ 1

Вы ищете Graphics.CopyFromScreen. Создайте новый растровый рисунок нужного размера и передайте экранные координаты объекта растровой графики области для копирования.

Там также статья, описывающая, как программно делать снимки.

Ответ на редактирование. Я неправильно понял, что вы имели в виду под "рабочим столом". Если вы хотите сделать снимок рабочего стола, вам необходимо:


Лучший способ сделать это - не нарушать другие окна, а копировать изображение непосредственно из окна рабочего стола. GetDesktopWindow в User32 вернет дескриптор рабочего стола. После того, как у вас есть дескриптор окна, получите контекст устройства и скопируйте изображение в новый растровый файл.

Там отличный пример в CodeProject о том, как скопировать изображение из него. Посмотрите пример кода о создании и создании контекста устройства в разделе "Захват содержимого окна".

Ответ 2

У меня создается впечатление, что вы снимаете для съемки фактического рабочего стола (с обоями и значками), и ничего больше.

1) Вызов ToggleDesktop() в Shell32 с помощью COM
2) Используйте Graphics.CopyFromScreen для копирования текущей области рабочего стола
3) Вызов ToggleDesktop() для восстановления предыдущего состояния рабочего стола

Изменить: Да, вызов MinimizeAll() является воинственным.

Здесь обновленная версия, которую я взбивал вместе:

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

    }

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

Ответ 3

Вы можете посмотреть GetDesktopWindow через p/invoke, затем получить контекст устройства и сделать снимок. Существует очень подробный учебник здесь. Это может быть лучше, чем возмущение существующих окон.

Ответ 4

Все прежние ответы совершенно неверны (минимизация приложений абсурд)
Просто используйте SHW api: одна строка кода (настольный растровый образ, который кэшируется, api просто блиит его к HDC...)

Ответ 5

Вы всегда можете поймать скриншот при запуске Windows перед запуском приложений или использовать другой рабочий стол с помощью переключения рабочего стола. Посмотрите здесь: http://www.codeproject.com/Articles/7666/Desktop-Switching Переключитесь на другой рабочий стол, сделайте снимок и помните, что вам не нужно его показывать, просто создайте его "DESKTOP"