Форум: "Начинающим";
Текущий архив: 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