Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Скриншот чужого окна, но без VCL, итог двух тем 
V
    Опции темы
Alix
Дата 19.9.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 3
Всего: 23



Была тема (BmpToPng or BmpToJpg in WinAPI), в которой говорилось о работе с изображениями на GDI, т.е. без VCL. 

Так же была тема (скриншот ( Canvas ) объекта чужого окна) о получении скриншота чужого окна без использования 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 приведен в сообщении Alexeis'a в первой теме.

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

  PrintWindow(handleMozilla, memDC, 0);


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


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0943 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.