Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

Скриншот активного окна   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.052 c
2-1346832461
Levran
2012-09-05 12:07
2013.03.22
порядок вывода записей


15-1340972066
Омлет
2012-06-29 16:14
2013.03.22
Почему в русском при отрицании [всё] = [ничего]?


4-1261729087
TN_TN
2009-12-25 11:18
2013.03.22
Определить готовность устройства


15-1352709195
Аббат Пиккола
2012-11-12 12:33
2013.03.22
За демократию


15-1339744950
RWolf
2012-06-15 11:22
2013.03.22
Древовидный редактор настроек