![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скриншот активного окна [D7]
stas © (2012-06-07 10:52:00)Делаю такой вот процедурой
procedure TssThread.ScreenShortWindow(var bmp: TBitMap);
var
c: TCanvas;
r, t: TRect;
h: THandle;
begin
c := TCanvas.Create;
c.Handle := GetWindowDC(GetDesktopWindow);
h := GetForeGroundWindow;
if h <> 0 then
GetWindowRect(h, t);
try
r := Rect(0,0,t.Right - t.Left, t.Bottom - t.Top);
bmp.Width := t.Right - t.Left;
bmp.Height := t.Bottom - t.Top;
bmp.Canvas.CopyRect(r, c, t);
finally
ReleaseDC(0, c.Handle);
c.Free;
end;
end;
Но почему-то если окно развернуто на весть экран захватывает часть панели задач. Если окно в обычном режиме то все нормально.
Проверял только на win 7 на XP нет возможности пока.
Подскажите никто не знает в чем баг?
stas (2012-06-07 14:49:00) [1]robt (07.06.12 14:29) [15]
тогда уже так: Alt+PrintScreen
stas (2012-06-07 14:48:00) [2]>Омлет © (07.06.12 11:54) [2]
Спасибо!
Сделал вот так:
procedure TssThread.ScreenShortWindow(var bmp: TBitMap);
var
c: TCanvas;
r, t: TRect;
h: THandle;
xf,yf:Integer;
begin
c := TCanvas.Create;
c.Handle := GetWindowDC(GetDesktopWindow);
h := GetForeGroundWindow;
if h <> 0 then
GetWindowRect(h, t);
xf:=0;
yf:= 0;
if (t.Left<0) then xf:=getSystemMetrics(SM_CXFRAME);
if (t.top<0) then yf:=getSystemMetrics(SM_CYFRAME);
try
r := Rect(-xf,-yf,t.Right - t.Left, t.Bottom - t.Top);
bmp.Width := t.Right - t.Left-xf;
bmp.Height := t.Bottom - t.Top-yf;
bmp.Canvas.CopyRect(r, c, t);
finally
ReleaseDC(0, c.Handle);
c.Free;
end;
end;
Работает.
Правда не совсем нравитсяif (t.Left<0) then...
может можно как-то обойтись без этого ) ?
robt (2012-06-07 14:29:00) [3]
> Поделись правильным кодом.
> Ты знаешь как по другому это сделать?
Alt+Ctrl+PrintScreen ;)))
Омлет (2012-06-07 14:00:00) [4]
> Был уверен, пока не прочитал [11].
В первом случае автор получал дескриптор десктопа, а не окна, так что разницы не было.
Давайте будем жрать! (2012-06-07 13:57:00) [5]
> Уверен?
Был уверен, пока не прочитал [11].
Омлет (2012-06-07 13:54:00) [6]> stas © (07.06.12 13:51) [11]
> Пытался сделать вот так, но форма без заголовка получается
"The GetDC function retrieves a handle to a device context (DC) for the client areaof a specified window or for the entire screen."
В этом и отличие от GetWindowDC.
stas (2012-06-07 13:51:00) [7]Пытался сделать вот так, но форма без заголовка получается
procedure TssThread.ScreenShortWindow(var Bmp:TBitmap);
var h:THandle;
r:TRect;
begin
h:=GetForegroundWindow ();
GetWindowRect (h,r);
bmp.Width := r.Right - r.Left;
bmp.Height := r.Bottom - r.Top;
BitBlt(bmp.Canvas.Handle, 0,0,r.Right, r.Bottom,
GetDC(h), 0,0,SRCCOPY);
end;
stas (2012-06-07 13:48:00) [8]robt (07.06.12 13:20) [8]
Ну, блин ты грамотный...
Ты знаешь как по другому это сделать?
Омлет (2012-06-07 13:36:00) [9]
> robt (07.06.12 13:20) [8]
Поделись правильным кодом.
robt (2012-06-07 13:20:00) [10]это вообще не скриншот активного окна, а скрин десктопа с копированием куска по координатам активного окна, тоесть говнокод с какогото FAQ
Омлет (2012-06-07 12:59:00) [11]
> CRLF (07.06.12 12:15) [5]
> Используй GetDC, а не GetWindowDC, и будет тебе щастье.
Уверен?
robt (2012-06-07 12:31:00) [12]а при чем тут собстна GetDesktopWindow ?
CRLF (2012-06-07 12:15:00) [13]Используй GetDC, а не GetWindowDC, и будет тебе щастье.
stas (2012-06-07 12:00:00) [14]Омлет © (07.06.12 11:54) [2]
ага спасибо попробую.
stas (2012-06-07 11:59:00) [15]Я вот о чем, если развернутое окно на весть экран, то захвачена часть панели задач, она ведь не относится к окну, а так же не видно левого и правого бортов формы
http://i021.radikal.ru/1206/50/ea8eacdd7254.jpg
а вот окно в нормальном виде- все как нужно
http://s019.radikal.ru/i621/1206/43/892052ba4977.jpg
Омлет (2012-06-07 11:54:00) [16]> экран захватывает часть панели задач
Не только панель задач. Координаты left и top имеют отрицательные размеры.
Всё потому, что у развернутого окна рамка находится за пределами клиентской области рабочего стола. Поэтому для него надо вычитать размер рамки (GetSystemMetrics + SM_CX(Y)SIZEFRAME + SM_CX(Y)FIXEDFRAME).
Хотя, может быть, есть другой способ получить этот размер.
CRLF (2012-06-07 11:50:00) [17]The GetWindowDC function retrieves the device context (DC) for the entire window, including title bar, menus, and scroll bars