Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.07.2013, 19:16   #1
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию Создание скриншота

Всем доброго времени суток. Столкнулся с такой проблемой:
- при создании скриншота , некоторые окна рисуются нормально, а вот некоторые - только рамка, а основное поле - черное.

С чем это может быть связано и получиться ли это подправить ?

Код
Код:
var
rcSrc:Trect;
hSrcWnd:HWND;
hDC1:HDC;
hSrcDC:HDC;
hBmp:HBITMAP ;
tBmp:TBitmap;
begin
  tbmp:=TBitmap.Create;

 hSrcWnd := FindWindow(nil, PChAR(Edit1.Text)); // заголовок окна
GetWindowRect(hSrcWnd, rcSrc);

hDC1:= GetDC(hSrcWnd);
hSrcDC:=CreateCompatibleDC(hDC1);
hBmp := CreateCompatibleBitmap(hDC1, rcSrc.right - rcSrc.left, rcSrc.bottom - rcSrc.top);

SelectObject(hSrcDC, hBmp);
PrintWindow(hSrcWnd, hSrcDC, 0);
BitBlt(hDC1, 0, 0, rcSrc.right - rcSrc.left, rcSrc.bottom - rcSrc.top, hSrcDC, 0, 0, SRCCOPY);



 tbmp.Handle:=hbmp;
tbmp.SaveToFile('D:\1.bmp');

 DeleteObject(hBmp);
DeleteDC(hSrcDC);
ReleaseDC(hSrcWnd, hDC1);
tbmp.Free;
-Jack- вне форума Ответить с цитированием
Старый 29.07.2013, 19:23   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Это может быть связанно с тем что отрисовка в таких "черных" окнах идет по другому, напрямую через драйвер экрана или видюхи. Короче минуя канву окон.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.07.2013, 19:38   #3
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Хм, спасибо ...
А есть ли способ всё же заполучить скриншот окна ?
-Jack- вне форума Ответить с цитированием
Старый 29.07.2013, 20:18   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Когда была проблема не снимающихся скриншотов в играх(да да, те самые, что минуют рисовальщик Windows), при включенной композиции раб. стола, мне удавалось делать скриншоты через DIB правда весили они огого(не менее 10-13 Мб), т.к. были без сжатия. Получился аналог BitBlt. Будет время, поищу модуль, если не удалил, то где-то валяется...

Последний раз редактировалось Человек_Борща; 29.07.2013 в 20:22.
Человек_Борща вне форума Ответить с цитированием
Старый 29.07.2013, 20:48   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
А есть ли способ всё же заполучить скриншот окна ?
Думаю что самый лучший - Mirror Driver. Если найдешь по нему что-то полезное (если захочешь конечно лезть в такие дебри) отпишись сюда, сам недавно интересовался (и буду интересоваться позже, как проект один доведу до ума) этой областью.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.07.2013, 21:52   #6
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Когда была проблема не снимающихся скриншотов в играх(да да, те самые, что минуют рисовальщик Windows), при включенной композиции раб. стола, мне удавалось делать скриншоты через DIB правда весили они огого(не менее 10-13 Мб), т.к. были без сжатия. Получился аналог BitBlt. Будет время, поищу модуль, если не удалил, то где-то валяется...
Было бы здорово, если поделишься своими наработками

Цитата:
Сообщение от Stilet Посмотреть сообщение
Думаю что самый лучший - Mirror Driver. Если найдешь по нему что-то полезное (если захочешь конечно лезть в такие дебри) отпишись сюда, сам недавно интересовался (и буду интересоваться позже, как проект один доведу до ума) этой областью.
Видимо придётся лезть ... Просто вариантов немного, или же в случаи не прорисовки скрипшота добавить корявую систему создания скриншота ( не через PrintWindow ), или же всё же смотреть что это за Mirror Driver
-Jack- вне форума Ответить с цитированием
Старый 30.07.2013, 16:29   #7
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Вот теперь вопрос, каким способом проверить, рисуется ли картинка или нет )

Хм ... попробую сравнить каждый пиксель картинки ...

Проблемка ...
Код:
  for X := 1 to 30 do
    for Y := 1 to 30 do
      begin
        Memo1.Lines.Add(IntToHEX(tbmp.Canvas.Pixels[X,Y], 6));
      end;
Почему то не видит то, постоянно FFFFFF выдаёт ... Хотя даже картинка нормально рисуется ...

Последний раз редактировалось Stilet; 12.08.2013 в 14:28.
-Jack- вне форума Ответить с цитированием
Старый 31.07.2013, 10:48   #8
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

А что если брать нулевой DC, получать картинку и вырезать оттуда изображение нужного окно?

Цитата:
Почему то не видит то, постоянно FFFFFF выдаёт ...
Может быть, потому что кратность 6 вы поставили...
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп
Larboss вне форума Ответить с цитированием
Старый 31.07.2013, 23:06   #9
-Jack-
Форумчанин
 
Регистрация: 19.04.2009
Сообщений: 368
По умолчанию

Цитата:
Сообщение от Larboss Посмотреть сообщение
А что если брать нулевой DC, получать картинку и вырезать оттуда изображение нужного окно?
Если брать 0 DC то мы будем получать скриншот экрана ... Но вот в чем загвоздка ... Нужное окно может быть перекрыто, и тогда мы не получим нужный результат ...

Цитата:
Сообщение от Larboss Посмотреть сообщение
Может быть, потому что кратность 6 вы поставили...
Это понятно... Но меня смущает то, что кроме как когда черного цвета я больше ничего не получаю ...
-Jack- вне форума Ответить с цитированием
Старый 01.08.2013, 04:21   #10
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

Цитата:
Если брать 0 DC то мы будем получать скриншот экрана ... Но вот в чем загвоздка ... Нужное окно может быть перекрыто, и тогда мы не получим нужный результат ...
А если посылать тому окну, которое нужно заскринить, сообщение "быть поверх" на время создания скрина и возвращать. Извращенно несколько, но если вы хотите получать скрин окна с "темным квадратом", тогда надо извлекать изображение из других мест(исходя из того, кто рисует в нем контент). Код будет сложней...

Цитата:
Это понятно... Но меня смущает то, что кроме как когда черного цвета я больше ничего не получаю ...
Напишите без приведение в хекс. Везде будет ноль?
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп
Larboss вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Выполнение скриншота. egorzenit Общие вопросы Delphi 2 16.03.2012 15:16
Assembler, создание скриншота Nalmelune Фриланс 3 21.12.2011 20:04
Получение скриншота pavellyba Общие вопросы Delphi 4 10.07.2011 22:42
Создание скриншота в файл XPAiN Microsoft Office Excel 6 11.11.2008 12:05
Передача скриншота Terran Работа с сетью в Delphi 1 17.12.2007 21:41