Здравствуйте. Задача такая: Как мне скопировать фон под моим окном? Первое, что приходить в голову, это перебрать посредством EnumWindows, все видимые окна и применить для них BitBlt, а потом по частям составить картинку. Как вы считаете это оптимально или есть более простое решение? Ответы принимаются на Паскаля и Си.)
Нет я имел в виду другое. Например открыты окна тоталкомандера и еще какие-либо, а сверху моя прога. так вот как моей проге получить ту часть экрана котороя находится под окном моей проги. перемещать и скрывать окно нельзя то есть окно должно казаться дырявым но только без исп регионов
Скопировать фон под окном и сделать его "дырявым" - разные вещи. Может, прозрачность поможет для второго случая?
Delphi Вариант с перебором окон и копированием через BitBlt Точно работать не будет. Проще всего свернуть окно, как уже советовал Pavia, но часто так делать нельзя - окно будет мигать. Почему нельзя использовать прозрачность и регионы?
Давайте по пунктам разбираться) 1. Вот описание BitBlt из хедера BOOL BitBlt(HDC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, HDC hdcSrc, int nXSrc, int nYSrc, DWORD dwRop); hdcSrc это хэндл окна которое я хочу скопировать. Теперь такая ситуация открыт тотал и запущена моя прога. В своей проге я использую BitBlt и передаю hdcSrc =GetDC(хэндл_тотала); и в итоге на выходе bitblt мы имееи фотку экрана с моей прогой. ) тогда какой смысл указывать хэндл источника окна для копирования То есть хотя и и передел хэндл окна тотала все равно скопировался почти весь экран (без панели задач) 2. Хочу написать скринмейт. для этого есть 4 способа: ПЕРВЫЙ. копирование фона как в мультиках (как раз то о чем я спрашиваю) ВТОРОЙ. регионы - это я уже умею ТРЕТИЙ. и ЧЕТВЕРТЫЙ сильно сложны... Пожалуйста обьясните мне смысл этого параметра hdcSrc, если он в нем есть
Delphi: >Давайте по пунктам разбираться) [...] >hdcSrc это хэндл окна которое я хочу скопировать. 1) hdcSrc - это НЕ хэндл окна, если хотите разобраться 2) И Вы уж все-таки определитесь, что хотите скопировать: ФОН или ОКНО 3) Пример решения для частного случая. Если Win>=2k и среди видимых окон, прикрытых окном вашей проги, нет WS_EX_LAYERED-окон, то чтобы получить "фон под окном" вашей проги - назначаете WS_EX_LAYERED окну проги, + BitBlt с флагом SRCCOPY (но без флага CAPTUREBLT!) ректангла окна проги как части экрана (а не самого окна проги!). У меня есть набросок (незаконченный, но вполне рабочий) учебной утилитки как раз на эту тему, сгодится как тренажер: http://www.geocities.com/xmemor/2lz/printlayered.zip
а зачем вообще чтото копировать ? в смысле зачем создавать свое окно ? Код (Text): hdc=GetWindowDC(NULL); // тут рисуем что хотим прямо // поверх (почти) всех окон ReleaseDC(NULL,hdc);
kropalik И это нужно перерисовывать несколько раз в секунду, а то может свернуться/развернуться другое окно или просто обновиться десктоп и картинка исчезнет.