Есть небольшой продукт — Манагер Виртуальных Десктопов. Используются функции CreateDesktop, OpenDesktop, SwitchDesktop и иже с ними. Требуется добавить фичу для предпросмотра фонового (не текущего) стола, скажем в отдельном окошке. Перерыл уже кучу информации но конкретного решения так и не нашел. Подход "в лоб" и копирование DC с не активного десктопа (или любого приложения на нем) дает в результате изображение области активного стола. Может кто сталкивался? Буду рад любой полезной информации или ссылке.
В данный момент также решу решение на поставленную перед тобой задачу. Единственно за что могу зацепиться — это функция CreateDC, которая позволяет работать с различными реальными мониторами (ну и рабочими столами, соответственно) точно и, похоже что, с виртуальными тоже.
Здравствуйте, fybits, Вы писали:
F>Единственно за что могу зацепиться — это функция CreateDC, которая позволяет работать с различными реальными мониторами (ну и рабочими столами, соответственно) точно и, похоже что, с виртуальными тоже.
С виртуальными столами не позволяет.
Хорошо, а если виртуальный рабочий стол активен, то как его снимок сделать? Пытался через ::GetDesktopWindow() и прочая, в итоге получаю черный экран. Не было подобной ситуации?
Пришла в голову еще одна идея:
1. Запускаем на виртуальном десктопе вспомогательную программу, имеющую уникальное имя;
2. Ищем это окошко с помощью FindWindow;
3. Спускаемся до десктопа с помощью parent = GetWindow (parent, GW_CHILD);
4. Снимаем вспомогательную програмку;
4. В итоге у нас в parent HWND дэсктопа, с которого можно снять скриншот обыкновенным способом.
Сам пока не реализовывал. Ваши мысли по сему поводу?
Здравствуйте, fybits, Вы писали:
F>Пришла в голову еще одна идея: F>1. Запускаем на виртуальном десктопе вспомогательную программу, имеющую уникальное имя; F>2. Ищем это окошко с помощью FindWindow; F>3. Спускаемся до десктопа с помощью parent = GetWindow (parent, GW_CHILD); F>4. Снимаем вспомогательную програмку; F>4. В итоге у нас в parent HWND дэсктопа, с которого можно снять скриншот обыкновенным способом.
F>Сам пока не реализовывал. Ваши мысли по сему поводу?
Здравствуйте, fybits, Вы писали:
F>Хорошо, а если виртуальный рабочий стол активен, то как его снимок сделать? Пытался через ::GetDesktopWindow() и прочая, в итоге получаю черный экран. Не было подобной ситуации?
В форуме достаточно много примеров как сделать снимок части экрана (или отдельного окна). Через поиск можно много интересного получить. Только вот решения моей проблемы на RSDN пока не видел.
Здравствуйте, BaTReligioN, Вы писали:
BTR>Есть небольшой продукт — Манагер Виртуальных Десктопов. Используются функции CreateDesktop, OpenDesktop, SwitchDesktop и иже с ними. Требуется добавить фичу для предпросмотра фонового (не текущего) стола, скажем в отдельном окошке. Перерыл уже кучу информации но конкретного решения так и не нашел. Подход "в лоб" и копирование DC с не активного десктопа (или любого приложения на нем) дает в результате изображение области активного стола. Может кто сталкивался? Буду рад любой полезной информации или ссылке.
Можно попробовать WM_PRINT. Возможно для этого потребуется сначала подключиться к нужному десктопу, а может и так прокатит. А может вообще не прокатит
Здравствуйте, SergH, Вы писали:
SH>Можно попробовать WM_PRINT. Возможно для этого потребуется сначала подключиться к нужному десктопу, а может и так прокатит. А может вообще не прокатит
Идея может прокатить, но опять же не все приложения видимо обрабатывают wm_print .
Есть ещё встречный вопрос. А можно ли сделать что-то вроде утилиты удаленного рабочего стола, только для столов виртуальных? Задача практически та же, только ещё требуется произвольное разрешение виртуальных столов, но без использования дополнительных сервисов (например Terminal services). Возможно ли такое вообще
Здравствуйте, BaTReligioN, Вы писали:
BTR>Идея может прокатить, но опять же не все приложения видимо обрабатывают wm_print .
Если приложение не обрабатывает WM_PRINT, то красивого способа я не знаю вообще, даже если оно на активном десктопе. Знаю некрасивый — залезть внутрь, перехватить BeginPaint и ещё пару функций, послать WM_PAINT и вернуть свой контекст. Ну там детали полезут, конечно, особенно с неклиентской областью, но тем не менее — вариант. Ещё, возможно, есть варианты через драйверы. Это может получиться почти без хаков, быстрее и элегантнее. А может и не получиться. Ну тут я не спец, посоветовать не могу ничего.
BTR>Есть ещё встречный вопрос. А можно ли сделать что-то вроде утилиты удаленного рабочего стола, только для столов виртуальных? Задача практически та же, только ещё требуется произвольное разрешение виртуальных столов, но без использования дополнительных сервисов (например Terminal services). Возможно ли такое вообще
Что значит "произвольное разрешение виртуальных столов"? Речь о разрешении экрана или о чём-то ином? В любом случае, пока не понял задачу.
Здравствуйте, SergH, Вы писали:
SH>Что значит "произвольное разрешение виртуальных столов"? Речь о разрешении экрана или о чём-то ином? В любом случае, пока не понял задачу.
Да. О разрешении экрана. В общем, сама задача сводится к следующей:
— запуск пользовательских окошек в области, не являющейся областью активного десктопа.
— возможность задания этой области произвольного разрешения (по аналогии с разрешением экрана)
— возможность слежения за этой областью с активного рабочего стола
Насколько я вижу, написание виртульного драйвера экрана тут единственное нормальное решение. Похоже скоро придется переместиться в другую ветку . Или нет?
Здравствуйте, BaTReligioN, Вы писали:
BTR>Здравствуйте, fybits, Вы писали:
F>>Хорошо, а если виртуальный рабочий стол активен, то как его снимок сделать? Пытался через ::GetDesktopWindow() и прочая, в итоге получаю черный экран. Не было подобной ситуации?
BTR>В форуме достаточно много примеров как сделать снимок части экрана (или отдельного окна). Через поиск можно много интересного получить. Только вот решения моей проблемы на RSDN пока не видел.
Дело в том, что я делаю ровно так, как "доктор прописал". В случае, если сохраняется снапшот реального экрана (т.е. того, из-под которого была вызван запуск виртуального десктопа), то я получаю полноценный GIF с экранным изображением. А если же я делаю SwitchDesktop() к созданному CreateDesktop() виртуальному экрану, то вместо картинки рабочего стола получаю черный прямоугольник экранного размера. В чем именно ошибка я понять не могу (для сохранения в gif использую Bitmap::FromHBITMAP() и Image::Save()).