Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.49 MB
Время: 0.083 c
2-1343500390
vasa777
2012-07-28 22:33
2013.03.22
скрыть ненужные компоненты из палитры


2-1330094823
Сергей
2012-02-24 18:47
2013.03.22
Как отменить сообщения компилятора?


15-1338920514
Глеб
2012-06-05 22:21
2013.03.22
виндосАпи


6-1260249129
Dmitriy
2009-12-08 08:12
2013.03.22
Как написать Firewall


15-1342014916
Zilog
2012-07-11 17:55
2013.03.22
дааа, а раньше форум кпиел





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский