Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Скриншот чужого окна, но без VCL


Автор: Alix 19.9.2007, 14:38
Была тема (http://forum.vingrad.ru/forum/topic-171341.html), в которой говорилось о работе с изображениями на GDI, т.е. без VCL. 

Так же была тема (http://forum.vingrad.ru/forum/topic-164967.html) о получении скриншота чужого окна без использования BitBlt (иначе фотографировались и перекрывающие искомое окна).
Там использовалась функция 
Код

// Prints window to specified device context (see MSDN)
function PrintWindow(hwnd: HWND; hdcBlt: HDC; nFlags: UINT): BOOL; stdcall;

implementation

function PrintWindow; external user32 name 'PrintWindow';


Нужно эти два кода совместить и я не знаю как. Ведь HBITMAP - не то же самое, что и HDC. Как можно получить HDC по HBITMAP или это вообще разные вещи?

Код такой:
Код

Program scr;
uses
  Windows,
  PngGDIP;

const
  EncoderQuality : TGUID = (D1: $1d5be4b5; D2: $fa4a; D3: $452d;
    D4: ($9c, $dd, $5d, $b3, $51, $05, $e7, $eb));
  EncoderParameterValueTypeLong  = 4;    // 32-bit unsigned int

var
  token: dword;
  input: TGdiplusStartupInput;
  image: GPIMAGE;
  Clsid: TGUID;
  hBMP   : HBITMAP;
  oldObj : HGDIOBJ;
  DESCDC : HDC;
  memDC  : HDC;
  Width  : Integer;
  Height : Integer;

  encoderParameters : TEncoderParameters;
  quality : Cardinal;

  handleMozilla : THandle;
  rect : TRect;

function PrintWindow(hwnd: HWND; hdcBlt: HDC; nFlags: UINT): BOOL; stdcall; external user32 name 'PrintWindow';

begin
  // change next line to find, for example, Notepad window or leave it if you have opened firefox window
  handleMozilla := FindWindow('MozillaUIWindowClass', nil);
  if not GetWindowRect(handleMozilla, rect) then
    Exit;

  Width  := Rect.Right - Rect.Left;
  Height := Rect.Bottom - Rect.Top;

  DESCDC := GetDC(handleMozilla);
  memDC  := CreateCompatibleDC(DESCDC);
  hBMP   := CreateCompatibleBitmap(DESCDC, Width, Height);
  oldObj := SelectObject(memDC, hBMP);

  PrintWindow(handleMozilla, hBMP, 0); // instead of next line, how to do???
//  BitBlt(memDC, 0, 0, Width, Height, DESCDC, 0, 0, SRCCOPY);

  image := nil;
  FillChar(input, SizeOf(input), 0);
  input.GdiplusVersion := 1;
  GdiplusStartup(token, @input, nil);
  GdipCreateBitmapFromHBITMAP(hBMP, 0, image);
  GetEncoderClsid('image/jpeg', Clsid);

  encoderParameters.Count := 1;
  encoderParameters.Parameter[0].Guid := EncoderQuality;
  encoderParameters.Parameter[0].Type_ := EncoderParameterValueTypeLong;
  encoderParameters.Parameter[0].NumberOfValues := 1;

  quality := 100; // max quality
  encoderParameters.Parameter[0].Value := @quality;

  GdipSaveImageToFile(image, '1.jpg', @ClsId, @encoderParameters);
  GdipDisposeImage(image);
  GdiplusShutdown(token);
  SelectObject(memDC, oldObj);
  DeleteObject(memDC);
  DeleteObject(hBMP);
  ReleaseDC(GetDesktopWindow(), DESCDC);
end.


Модуль PngGDIP приведен в http://forum.vingrad.ru/index.php?showtopic=171341&view=findpost&p=1251959 в первой теме.

Добавлено через 6 минут и 27 секунд
Убейте меня об стену smile  
Код

  PrintWindow(handleMozilla, memDC, 0);


Ну почему решения доходят только тогда, когда запостишь тему?? А сколько перед этим не бейся, все равно не доходит...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)