Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: WinAPI и системное программирование > Desktop |
Автор: php 2.8.2007, 06:46 |
Как получить раб. стол т.е его снимок без фонового рисунка только иконки ну и сами окна примеру ?? |
Автор: Virtuals 2.8.2007, 08:26 |
никак, рисунок загружен в окно рабочего стола DC=0; ну если только отключить фоновой рисунок, скопировать изображение, включить рисунок ![]() |
Автор: php 2.8.2007, 12:17 |
Да ну ерунда, я ведь уверен, что способ есть ![]() Взять тот же RAdmin, PCAnywhere там ведь получение идёт частичное без фона, чем и разгружает траффик, вопрос как это можно реализовать ??? |
Автор: Alexeis 2.8.2007, 12:23 |
Может получает картинку рабочего стола и вычитает из нее рабочий стол, затем все что нечерное заливает белым, после чего делает операцию AND с исходной, тогда рабочий стол удалиться а все остальное останется на месте. |
Автор: bems 2.8.2007, 16:31 |
попробуй поработать с ним, как с обычным ListView |
Автор: php 3.8.2007, 06:35 |
Alexeis, bems вот это уже интересно поподробнее, плиз ! |
Автор: Alexeis 3.8.2007, 09:07 |
Путь к обоям можно найти тут 1) HKEY_CURRENT_USER\Control Panel\Desktop\Wallpaper Это всегда будет битмап с битностью цвета такой какая установлена в системе. 2) битовые операции над картинками осуществляет функция BitBlt, параметры операции устанавливаются последним параметром. |
Автор: php 6.8.2007, 06:24 |
Так и что нам это даёт? т.е мы можем преобразовать битмап с меньшей битностью, но как сделать его монотонным ? или я что-то не так понял?? |
Автор: BaD_SeCt0R 6.8.2007, 19:54 |
Если суть в экономии трафика, и если нужны только иконки и окна, то можно просто составить список иконок, их мест, а также по дескрипторам окон составить запись всех контролов этих окон. Это, конечно, будет работать в случае, если окон не много. А так Alexeis прежложил, помоему очень неплохой вариант. Юзай BitBlt/TransparentBlt ![]() |
Автор: php 7.8.2007, 04:07 |
Согласен вариант очень неплохой только не могу реализовать, может поможете ?? |
Автор: Alexeis 7.8.2007, 11:47 | ||
Есть проблемы. Если исходная картинка для обоев была другого размера, то работать не будет, а сделать стретч так же как винда не получается, да и не получиться ведь в зависимости от версии метод сжатия/растяжения может меняться. Исходный формат не имеет значения, так как винда все равно конвертит его в BMP, а вот как бы найти ее кэшированую картинку... Ну впрочем можно проверять если картинка отличается от размеров рабочего стола, то не применять методику. Вот, а вот результирующая pngшка сжалась до 32кб. см. Атач. |
Автор: Virtuals 7.8.2007, 17:06 |
сам же себя и опровергаю // смотрим ЗЫ о нашел нечто похожее, сам бился над проблемой получения окна скрытого другим, решение _+_+_+ function PrintWindow(hwnd: HWND; hdcBlt: HDC; nFlags: UINT): BOOL; stdcall; implementation function PrintWindow; external user32 name 'PrintWindow'; +_+_+_+_ PrintWindow(findwindow('Progman',nil), PaintBox2.Canvas.Handle, 0); \\но именно с progmanom какието глюки ща расковыриваю функцию PrintWindow \\ ни разу не видел ее и в 2000 исходниках не находил ![]() она заставляет приложение отрисоватся в другом месте, (и иногда приложение забывает где правильно рисовать ![]() ЗЫ короче рисунок находится на DC=0 а иконки на окне 'Progman' (прозрачном) dash1 |
Автор: php 8.8.2007, 09:04 |
Да блин в этом то и проблема тут ведь идёт попиксельное сравнение двух изображений исходной картинки и раб. стола, но если размер результирующей picture не совпадает тут начинаются проблемы..... ![]() Щас тоже буду думать как оптимизировать это дело позже сообщу о результатах.... |
Автор: php 8.8.2007, 15:11 |
Да кстати тут ещё одну приколюху нашёл немного не затирается рисунок вокруг надписей у иконок ![]() |
Автор: Alexeis 8.8.2007, 16:35 |
Ну тут проблема с альфа-каналом думаю, с одной стороны цвет отличается от картинки, с другой содержит ее часть, так что как-то так... |
Автор: php 9.8.2007, 03:18 |
В общем у меня тут идея возникла как создать картинку соразмерную с рабочим столом, в рез-те чего картинку из Wallpappers использовать не будем, а сделаем так: 1) При загрузке системы прикрываем на время Explorer в рез-те чего уберутся все иконки и таскбар, делаем быстренько скриншот экрана и помещаем его в папку Windows или System32 не важно, под названием скажем Cache.bmp, затем снова запускаем Explorer. При последующей загрузке системы если файл уже существует то ничего больше не делаем, таким образом мы получаем изображение соразмерное с раб. столом. Как вам моя идея ? Или не очень ? |
Автор: Alexeis 9.8.2007, 12:09 |
А если обои сменили? |
Автор: Rennigth 9.8.2007, 17:14 |
если честно не очень... Ну это можно и отловить ![]() |
Автор: php 9.8.2007, 17:32 | ||
Ну а если обои сменили, то определяем размер и дату изменения файла, если какое-либо из условий не совпадает, значит обои поменяли заново обновляем файл вот и всё, можно и по другому изменение отловить... Ваши предложения ???
Есть идеи получше ![]() |
Автор: Virtuals 9.8.2007, 19:57 | ||
тень! |
Автор: php 30.9.2007, 03:52 |
Так продолжая тему двухмесячной давности.. вот мы сравнили две картинки методом ScanLine, а можно ли как-то выделить эти изменившиеся части изображения и сохранить их в файл или поток для дальнейшей обработки ??? |
Автор: Alexeis 30.9.2007, 11:37 |
Какая обработка предвидится? |
Автор: php 1.10.2007, 11:12 |
Сохранение выделеных кусков в поток передача их по сети к клиенту (это уже моя забота), ну и далее "налепление" выделенных кусков на существующее предыдущее изображение Вот такая обработка ! |
Автор: php 1.10.2007, 12:41 |
Вот все говорят пожимать в RLE, а что можно по подробнее ?? zLib использовать пробовал тормоза "жутчайшие" может правда не то пробовал это было из папки Demos в Delphi где-то. Добавлено через 1 минуту и 28 секунд Да кстати может его в png конвертить сразу в таком случае как его перевести из bmp в png ? |
Автор: Alexeis 1.10.2007, 14:57 | ||
Это еще медленнее. Про RLE есть в вики http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%B4%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%BB%D0%B8%D0%BD_%D1%81%D0%B5%D1%80%D0%B8%D0%B9 Есть в MSDN, но там алгоритм для 16/256 цветов. |
Автор: php 2.10.2007, 06:10 |
Можно ссылку на MSDN тоже ?, в принципе для 16/256 цветов тоже нормальный вариант ! |
Автор: Alexeis 2.10.2007, 09:08 | ||
Но об этом много знать и не нужно, так как RLE 256/16 поддерживается на уровне API. Функция GetDIBits() - возвращает такую сжатую маску. |
Автор: php 3.10.2007, 03:32 |
Можно на примере, а то я только на C++ нашёл ?? |
Автор: php 11.10.2007, 12:39 |
Так стоп в смысле "сжатую" маску прошу разъяснить ? |
Автор: Alexeis 11.10.2007, 12:47 |
Ну эт я так иногда называю битовую карту. Правильнее сжатая битовая карта, т.е. растр другими словами. |
Автор: php 12.10.2007, 05:53 |
Сорри за глупые вопросы, но что мне это даёт ? и как мне это применить в моём случае ? |
Автор: Alexeis 12.10.2007, 08:57 |
Это дает то что скриншоты получаются маленькими по размеру и не так загружают сеть. Сжать картинку, передать, на той стороне распаковать, сложить с фоном и получить на экране картинку рабочего стола. |
Автор: php 12.10.2007, 11:35 |
В смысле маленькими по размеру тут нужно уточнить имеется ввиду размер по высоте-длине или фактический размер картинки в байтах если да то насколько меньше они по размеру ?? |
Автор: Alexeis 12.10.2007, 12:32 |
фактический. На сколько зависит от картинки. Разностные должны хорошо жаться, думаю если экран меняется медленно то 100 раз реально. |
Автор: php 12.10.2007, 14:23 |
Что-то я видимо совсем туплю или чего-то не понимаю всё таки ещё раз картинка сжимается чем-либо еще типа zLib или она уже сжатая битовая карта посредством этого GetDIBits или как его там?? и её прямо так можно уже отправлять по сети?? |
Автор: Alexeis 12.10.2007, 14:51 |
GetDIBits можно использовать для RLE сжатия картинок с числом цветов не более 256, потому он врядли пригодиться... Если формат соответствует то можно прям так и отправлять. Но сейчас на 256 цветах почти не работают... потому прийдеться свой алгоритм писать. Еще есть вариант сжимать в TIFF или PCX. Эти форматы тоже хранят изображения сжатые методом RLE. |
Автор: php 15.10.2007, 03:14 |
Да кстати, я что это борландовцы зажилили исходный код файла Jpeg.pas можно ли где-то его достать ?? |
Автор: Alexeis 15.10.2007, 08:54 |
php, метод jpeg жмет медленно и некачественно чертежи или изображения с множеством тонких и контрастных линий. ИМХО лучше копать в сторону TIFF. Он популярный и быстрый. |
Автор: php 16.10.2007, 03:13 |
Да я уже заметил, что Jpeg явно уступает по скорости сжатия даже ZLib. А что правда TIFF очень быстрый что-то я про это ничего нигде не слышал или что-то пропустил ?? |
Автор: Alexeis 16.10.2007, 09:29 | ||
Ну я вот порылся в инете, оказывается что TIFF поддерживает различные форматы сжатия. Быстрым разумеется будет только PackBits (RLE).
Можно себе что-то подобрать http://www.torry.net/quicksearchd.php?String=TIFF&Title=Yes |
Автор: RA 17.10.2007, 00:41 |
Не знаю как там работают всякие: RAdmin и PCAnywhere, но подход с вычитанием десктопа из принт скрина ИМХО - LOL. ![]() Гораздо интересней получить координаты иконок и ассоциированные с ними картинки, а потом расположить их в соответствии и разрешением экрана у себя на клиентской части отображения, что касается открытых окон на фоне десктопа то тут уже много разных траффико-экономичных подходов можно применить. К примеру если окно эксплореровское то можно получить его координаты, а также координаты иконок и сами иконки и расположить всё это у себя, при этом можно учитывать файлы с индивидуальными иконками и файлы с общими иконками. Если окно чужое то тупо сфоткать его область, и получить его координаты. Если окно видно из под окна, то сфоткать общую область совместно занимаемого квадрата, а потом исходя из координат окошек вырезать всё что лишнее (С не прямоугольными окнами получится галимо) , ну и тд ...... ![]() |
Автор: php 17.10.2007, 03:36 |
Да да да всё это уже пройденный этап и иконки получал и даже окна нестандартной формы с получением её регионов, но тут есть свои подводные камни во первых много в системе разных "суетливых" манипуляций я уже точно не помню в чём, но у меня в процессе разработки возникла какая-то проблема с этим всем делом. |