Главная страница
    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.003 c
15-1295853671
usrg
2011-01-24 10:21
2011.05.08
Вопрос о приобретении EhLib


2-1296736634
zlodey
2011-02-03 15:37
2011.05.08
непонятная ошибка


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


15-1295873780
MonoLife
2011-01-24 15:56
2011.05.08
Открыть URL адрес в папке проводника


4-1247905415
imtec
2009-07-18 12:23
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский