Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.05.08;
Скачать: [xml.tar.bz2];

Вниз

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

 
Тимоха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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.004 c
1-1253636485
alexrayne
2009-09-22 20:21
2011.05.08
как вложить компонент в ячейку DrawGrid?


15-1295617274
Knight
2011-01-21 16:41
2011.05.08
План счетов применительно к ИТ


3-1258272518
Drowsy
2009-11-15 11:08
2011.05.08
Хранимые процедуры. InterBase6.


2-1296798738
wo1fnet
2011-02-04 08:52
2011.05.08
JavaScript в Delphi


15-1295351568
начинающий2
2011-01-18 14:52
2011.05.08
как можно создать такой класс?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский