Есть ли способ сделать скриншот рабочего стола Windows пользователя? - PullRequest
15 голосов
/ 19 мая 2009

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

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

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

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

Ответы [ 5 ]

16 голосов
/ 19 мая 2009

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

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

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

  1. Свернуть все окна, используя Win32API (сначала отправить сообщение MIN_ALL)
  2. Сделайте снимок
  3. Затем отмените сворачивание всех (отправьте сообщение MIN_ALL_UNDO).

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

На CodeProject есть отличный пример *1033* того, как скопировать из него изображение. Найдите пример кода о получении и создании контекста устройства в разделе «Захват содержимого окна».

10 голосов
/ 19 мая 2009

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

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;

    }

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

2 голосов
/ 19 мая 2009

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

0 голосов
/ 26 сентября 2012

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

0 голосов
/ 20 мая 2009

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

...