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

Вниз

Захват изображения части окна   Найти похожие ветки 

 
Тимоха111   (2011-01-25 13:02) [0]

Данный код берет изображение из окна с заданным хендлом, но стоит поверх окна открыть другое, как изображение копируется из вновь открытого окна. Можно ли получать изображение непосредственно из заданного окна? Даже если оно находится "под" другими окнами? Спасибо
var
 DC: HDC;
 x1, y1: integer;
 bmp: Graphics.TBitmap;
 h:hwnd;
begin
 h := 1923729;
 bmp := Graphics.TBitmap.Create;
 x1 := 100;
 y1 := 100;
 bmp.Height := 50;
 bmp.Width := 100;
 bmp.PixelFormat := pf32bit;
 DC := GetDC(h);
 bitblt(bmp.Canvas.Handle, 0, 0, bmp.Width, bmp.Height, DC, x1, y1, SRCCOPY);
 frmmain.Image1.Picture.Assign(bmp);
 bmp.IgnorePalette := true;
 ReleaseDC(0, DC);
 bmp.Free;


 
clickmaker ©   (2011-01-25 13:03) [1]

h := хэндл заданного окна


 
Тимоха111   (2011-01-25 13:05) [2]

или другими словами как получить скриншот неактивного окна?


 
Тимоха111   (2011-01-25 13:06) [3]


> h := хэндл заданного окна

да, заданного, неактивного


 
Тимоха111   (2011-01-25 13:44) [4]

можно конечно использовать SetForegroundWindow, но это крайне неудобно, хотелось бы получать изображение для не активного окна, при условии что оно не свернуто


 
HF-Trade ©   (2011-01-25 14:58) [5]

В Win7\Vista вроде бы можно, при соответствующей схеме.
В ХР нельзя, но можно сдвинуть окно за видимую область экрана, и делать снимок с рабочего стола.


 
Тимоха111   (2011-01-25 15:03) [6]

HF-Trade, спасибо, думаю вариант со сдвигом за видимую область экрана мне подойдет!


 
Студент   (2011-01-25 20:15) [7]

Получить изображение неактивного/перекрытого окна возможно только при помощи PrintWindow... В заголовках Делфи7 не объявлено, придётся вручную...
Ещё оно вроде только для ОС начиная с Вин2000... Да и то не для всех окон срабатывает...


> но можно сдвинуть окно за видимую область экрана, и делать
> снимок с рабочего стола


Пробовали уже многие подобные костыли... Не вариант...


> вариант со сдвигом за видимую область экрана мне подойдет


Хотите секрет? Если сдвинуть окно за граниы видимости оно не будет хранить своё изображение... В лучшем случае "зальётся" цветом фона... Это ж для ОС пустая трата ресурсов всё хранить...


 
Тимоха111   (2011-01-26 00:31) [8]

Спасибо, дельное замечание!
А если попробовать изменить разрешение экрана, путем увеличения width?


 
KilkennyCat ©   (2011-01-26 00:45) [9]


>
> > но можно сдвинуть окно за видимую область экрана, и делать
> > снимок с рабочего стола
>
>
> Пробовали уже многие подобные костыли... Не вариант..

да, я на днях писал замену тюнеру - в принципе не позволяет ни за границу, ни на другой монитор сдвинуться.


 
Студент   (2011-01-26 20:16) [10]


> А если попробовать изменить разрешение экрана, путем увеличения
> width?


Пользователю сидеть и смотреть как весь экран коробит туда-сюда? И что это за width такой волшебный что им аж разрешение экрана можно менять?)

Может сначала всё-таки попробовать PrintWindow? Какая целевая ОС? Если XP и выше то это то что надо...


 
MonoLife ©   (2011-01-27 04:24) [11]


> можно конечно использовать SetForegroundWindow, но это крайне неудобно

Почему?


 
MonoLife ©   (2011-01-27 12:28) [12]

var
Canvas: TCanvas;
ScreenV: HDC;
bp: TBitmap;
screenfind: HWND;
myRect: Trect;
s: string;
begin
bp:=TBitmap.Create;
Canvas:=TCanvas.Create();
try
  s:="Заголовок Требуемое окно";
  screenfind:= FindWindow(nil, PChar(s));
   if screenfind<>0 then
    begin
      ShowWindow(screenfind, SW_SHOWNORMAL);
        if SetForegroundWindow(screenfind) then
         begin
          ScreenV := GetDC(0);
          try
             GetWindowRect(screenfind, myRect);
             bp.Width:=myRect.Right-myRect.Left;
             bp.Height:=myRect.Bottom-myRect.Top;
             Canvas.Handle:=ScreenV;
             sleep(100); //лучше больше
             bp.Canvas.CopyRect(rect(0,0, bp.Width, bp.Height), canvas, myRect);
             bp.SaveToFile("C:\"+s+".bmp");
         finally
           ReleaseDC(0,ScreenV);
         end;
       end;
     end;
finally
 Canvas.Free;
 bp.Free;
end;


 
Студент   (2011-01-30 18:50) [13]


> [12]


Какой... м... Кошмар... %)

Function PrintWindow(HWND: HWND; hdcBlt: HDC; nFlags: DWORD): BOOL; StdCall; External "user32.dll";

Procedure TForm1.Button1Click(Sender: TObject);
Var WNDHandle: HWND;
Begin
WNDHandle:=FindWindow(Nil, "Калькулятор");
If WNDHandle<>0 Then
     If IsIconic(WNDHandle) Then
           ShowMessage("Minimized!")
     Else
           PrintWindow(WNDHandle, Form1.Canvas.Handle, 0)
Else
     ShowMessage("Not Found!");
End;



Страницы: 1 вся ветка

Текущий архив: 2011.05.08;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.007 c
15-1294825167
usrg
2011-01-12 12:39
2011.05.08
О чем говориться в Eclipse Public License?


2-1296601833
Тимоха111
2011-02-02 02:10
2011.05.08
импорт функции в длл


1-1253695891
Игорь
2009-09-23 12:51
2011.05.08
Как правильно передать из DLL?


15-1295645386
Юрий
2011-01-22 00:29
2011.05.08
С днем рождения ! 22 января 2011 суббота


2-1296692040
antonn
2011-02-03 03:14
2011.05.08
отложенная загрузка картинки в THTMLViewer/ThtmlLite