Была тема (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 секунд Убейте меня об стену | Код | PrintWindow(handleMozilla, memDC, 0);
|
Ну почему решения доходят только тогда, когда запостишь тему?? А сколько перед этим не бейся, все равно не доходит... |