Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизСкриншот активного окна Найти похожие ветки
← →
stas © (2012-06-07 10:52) [0]Делаю такой вот процедурой
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 нет возможности пока.
Подскажите никто не знает в чем баг?
← →
CRLF (2012-06-07 11:50) [1]The GetWindowDC function retrieves the device context (DC) for the entire window, including title bar, menus, and scroll bars
← →
Омлет © (2012-06-07 11:54) [2]> экран захватывает часть панели задач
Не только панель задач. Координаты left и top имеют отрицательные размеры.
Всё потому, что у развернутого окна рамка находится за пределами клиентской области рабочего стола. Поэтому для него надо вычитать размер рамки (GetSystemMetrics + SM_CX(Y)SIZEFRAME + SM_CX(Y)FIXEDFRAME).
Хотя, может быть, есть другой способ получить этот размер.
← →
stas © (2012-06-07 11:59) [3]Я вот о чем, если развернутое окно на весть экран, то захвачена часть панели задач, она ведь не относится к окну, а так же не видно левого и правого бортов формы
http://i021.radikal.ru/1206/50/ea8eacdd7254.jpg
а вот окно в нормальном виде- все как нужно
http://s019.radikal.ru/i621/1206/43/892052ba4977.jpg
← →
stas © (2012-06-07 12:00) [4]Омлет © (07.06.12 11:54) [2]
ага спасибо попробую.
← →
CRLF (2012-06-07 12:15) [5]Используй GetDC, а не GetWindowDC, и будет тебе щастье.
← →
robt (2012-06-07 12:31) [6]а при чем тут собстна GetDesktopWindow ?
← →
Омлет © (2012-06-07 12:59) [7]
> CRLF (07.06.12 12:15) [5]
> Используй GetDC, а не GetWindowDC, и будет тебе щастье.
Уверен?
← →
robt (2012-06-07 13:20) [8]это вообще не скриншот активного окна, а скрин десктопа с копированием куска по координатам активного окна, тоесть говнокод с какогото FAQ
← →
Омлет © (2012-06-07 13:36) [9]
> robt (07.06.12 13:20) [8]
Поделись правильным кодом.
← →
stas © (2012-06-07 13:48) [10]robt (07.06.12 13:20) [8]
Ну, блин ты грамотный...
Ты знаешь как по другому это сделать?
← →
stas © (2012-06-07 13:51) [11]Пытался сделать вот так, но форма без заголовка получается
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;
← →
Омлет © (2012-06-07 13:54) [12]> stas © (07.06.12 13:51) [11]
> Пытался сделать вот так, но форма без заголовка получается
"The GetDC function retrieves a handle to a device context (DC) for the client area of a specified window or for the entire screen."
В этом и отличие от GetWindowDC.
← →
Давайте будем жрать! (2012-06-07 13:57) [13]
> Уверен?
Был уверен, пока не прочитал [11].
← →
Омлет © (2012-06-07 14:00) [14]
> Был уверен, пока не прочитал [11].
В первом случае автор получал дескриптор десктопа, а не окна, так что разницы не было.
← →
robt (2012-06-07 14:29) [15]
> Поделись правильным кодом.
> Ты знаешь как по другому это сделать?
Alt+Ctrl+PrintScreen ;)))
← →
stas © (2012-06-07 14:48) [16]>Омлет © (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...
может можно как-то обойтись без этого ) ?
← →
stas © (2012-06-07 14:49) [17]robt (07.06.12 14:29) [15]
тогда уже так: Alt+PrintScreen
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.057 c