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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.02.2008, 20:20   #1
Electrod
Пользователь
 
Регистрация: 26.01.2008
Сообщений: 10
По умолчанию Функция PrintWindow

Здравствуйте.
Нужно реализовать скриншот чужого окна.Окно может быть перекрыто.
После многих экспериментов, выяснилось- что если скриншотить через Api функцию PrintWindow - получается то что надо.
Отсюда вопрос:

Не подскажите синтаксис функции PrintWindow, как ее подключить в Delphi. Хоть какой-нить пример .
Electrod вне форума Ответить с цитированием
Старый 22.02.2008, 21:12   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

здесь написано -
http://msdn2.microsoft.com/en-us/lib...95(VS.85).aspx

Цитата:
BOOL PrintWindow(
HWND hwnd, // хендл копируемого окна
HDC hdcBlt, // хендл DC для копирования
UINT nFlags // флаги
);
заголовок для Delphi
Код:
function PrintWindow(HWND:HWND;hdcBlt:HDC;nFlags:DWORD):BOOL; stdcall; external 'user32.dll';

Последний раз редактировалось rpy3uH; 22.02.2008 в 21:17.
rpy3uH вне форума Ответить с цитированием
Старый 23.02.2008, 12:19   #3
Electrod
Пользователь
 
Регистрация: 26.01.2008
Сообщений: 10
По умолчанию

2 rpy3uH
Спасибо, функцию включил.

Но вот работать что-то не хочет. Белый квадрат вместо скрина. может у меня ошибка в коде,тока найти я ее не могу.
Гляньте код, сработает ли он у вас, или может ошибку укажите.
Код:
....
function PrintWindow(HWND:HWND;hdcBlt:HDC;nFlags:DWORD):BOOL; stdcall; external 'user32.dll';
...........
var 
hg:HWND:
DC:HDC;
BMP:TBITMAP;
R: TRect;
begin
 hg := WindowFromPoint(Mouse.CursorPos);
 bmp:=TBitmap.Create;
 GetWindowRect(hg, R);
 Bmp.Width:= R.Right - R.Left;
 Bmp.Height:= R.Bottom - R.Top;
 dc:=GetDc(Integer(Bmp.Canvas.Handle));
 PrintWindow(hg,Integer(Bmp.Canvas.Handle), PRF_NONCLIENT or PRF_CHECKVISIBLE or PRF_CLIENT or PRF_ERASEBKGND or PRF_CHILDREN);
 bmp.SaveToFile('c:\1\2.bmp');
 Bmp.Free;
 ReleaseDc(0, dc)
end;

Последний раз редактировалось rpy3uH; 23.02.2008 в 12:33.
Electrod вне форума Ответить с цитированием
Старый 23.02.2008, 16:15   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Electrod Посмотреть сообщение
Но вот работать что-то не хочет. Белый квадрат вместо скрина. может у меня ошибка в коде,тока найти я ее не могу.
Подозреваю, что это связано с путаницей с контекстами. Из-за отсутствия Delphi не могу проверить "живьём" данный код, но вот такой код на C прекрасно копирует "чужое" окно, даже если оно за границами экрана:

Код:
		RECT rcSrc;
		HWND hSrcWnd;
		HDC hDC, hSrcDC;
		HBITMAP hBmp;

		hSrcWnd = FindWindow(NULL, "*********"); // "*********" - имя нужного окна
		GetWindowRect(hSrcWnd, &rcSrc);

		hDC = GetDC(hWnd);
		hSrcDC = CreateCompatibleDC(NULL);
		hBmp = CreateCompatibleBitmap(hDC, rcSrc.right - rcSrc.left, rcSrc.bottom - rcSrc.top);
			
		SelectObject(hSrcDC, hBmp);
		PrintWindow(hSrcWnd, hSrcDC, 0);

		BitBlt(
			hDC, 
			0,
			0,
			rcSrc.right - rcSrc.left, 
			rcSrc.bottom - rcSrc.top,
			hSrcDC, 
			0,
			0,
			SRCCOPY);
	
		DeleteObject(hBmp);
		DeleteDC(hSrcDC);
		ReleaseDC(hWnd, hDC);
B_N вне форума Ответить с цитированием
Старый 24.02.2008, 01:05   #5
Electrod
Пользователь
 
Регистрация: 26.01.2008
Сообщений: 10
По умолчанию

2 B_N
Мега респект тебе! Спасибо!
И всем кто помогал!
Видать действительно была проблема с контекстами.
Подправил пример из С ,чтобы на делфи работал. И Ура, все получилось.

Вот,выкладываю, может кому пригодится.
Код:
...............
function PrintWindow(HWND:HWND;hdcBlt:HDC;nFlags:DWORD):BOOL; stdcall; external 'user32.dll';
.................
var
rcSrc:Trect;
hSrcWnd:HWND;
hDC1:HDC;
hSrcDC:HDC;
hBmp:HBITMAP ;
tBmp:TBitmap;
begin
  tbmp:=TBitmap.Create;

 hSrcWnd := FindWindow(nil, PChAR('Test')); // "*********" - имя нужного окна
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('c:\1.bmp');

 DeleteObject(hBmp);
DeleteDC(hSrcDC);
ReleaseDC(hSrcWnd, hDC1);
tbmp.Free;
end;

Последний раз редактировалось rpy3uH; 24.02.2008 в 16:09.
Electrod вне форума Ответить с цитированием
Старый 20.04.2010, 17:06   #6
Sanya111
 
Регистрация: 16.04.2010
Сообщений: 3
По умолчанию

Подскажите пожалуйста, как можно загрузить полученный скрин сразу в TImage не сохраняя на винт?
Sanya111 вне форума Ответить с цитированием
Старый 20.04.2010, 17:16   #7
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...например, через .assign(tbmp)
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 20.04.2010, 17:24   #8
Sanya111
 
Регистрация: 16.04.2010
Сообщений: 3
По умолчанию

Цитата:
Сообщение от raxp Посмотреть сообщение
...например, через .assign(tbmp)
Пожалуйста, подскажите как правильно записать эту строку, чтобы скрин сразу отобразился в TImage
Sanya111 вне форума Ответить с цитированием
Старый 20.04.2010, 19:56   #9
liljon
Форумчанин
 
Регистрация: 03.01.2010
Сообщений: 229
По умолчанию

Цитата:
Сообщение от B_N Посмотреть сообщение
Подозреваю, что это связано с путаницей с контекстами. Из-за отсутствия Delphi не могу проверить "живьём" данный код, но вот такой код на C прекрасно копирует "чужое" окно, даже если оно за границами экрана:
А если данное окно находиться под другим окном?
подпись
liljon вне форума Ответить с цитированием
Старый 20.04.2010, 20:01   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Код:
image1.Picture.Bitmap.Assign(tbmp);
tbmp.Free;
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функция ZiLi Microsoft Office Excel 1 05.09.2008 18:37
функция sergei64_89 Общие вопросы C/C++ 2 25.05.2008 16:48
функция Janette Помощь студентам 1 29.04.2008 20:10
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50