используйте hWnd := GetDesktopWindow для получения дескриптора 'рабочего
стола'; используйте hDC := GetDC (hWnd) для получения HDC (дескриптора
контекста экрана) ; и не забывайте освобождать (уничтожать дескриптор) hDC
после выполнения задачи.
Используя TCanvas.Handle в качестве HDC, можно при помощи WinAPI реализовать
функции рисования, или, если это возможно, можно присвоить HDC свойству Handle
непосредственно при создании TCanvas.
Here is the translation of the text into Russian:
Пример использования стандартной Windows API в Delphi для получения скриншота:
uses
Windows, Graphics;
procedure TForm1.GetScreenshot;
var
hDC: HDC;
hBitmap: HBITMAP;
hOldBitmap: HBITMAP;
hScreenDC: HDC;
begin
// Получить handle окна рабочего стола
hWnd := GetDesktopWindow;
// Получить контекст устройства (HDC) для окна рабочего стола
hDC := GetDC(hWnd);
// Создать битмап, чтобы хранить скриншот
hBitmap := CreateCompatibleBitmap(hDC, Screen.Width, Screen.Height);
hOldBitmap := SelectObject(hDC, hBitmap);
// Получить контекст устройства экрана
hScreenDC := CreateCompatibleDC(hDC);
// BitBlt окно рабочего стола на битмап
BitBlt(hScreenDC, 0, 0, Screen.Width, Screen.Height, hDC, 0, 0, SRCCOPY);
// Очистить
SelectObject(hScreenDC, hOldBitmap);
DeleteObject(hBitmap);
ReleaseDC(hWnd, hScreenDC);
end;
Код получает handle окна рабочего стола с помощью GetDesktopWindow, а затем контекст устройства (HDC) для этого окна с помощью GetDC. Он создает битмап, чтобы хранить скриншот с помощью CreateCompatibleBitmap, и выбирает его в контексте устройства с помощью SelectObject.
Затем он получает контекст устройства экрана с помощью CreateCompatibleDC и использует BitBlt для копирования окна рабочего стола на битмап. Наконец, он очищает, выбрав оригинальный битмап обратно в контексте устройства с помощью SelectObject, удалив временный битмап с помощью DeleteObject и освободив контекст устройства экрана с помощью ReleaseDC.
Вы можете использовать этот код как есть или модифицировать его для своих конкретных нужд.
Также можно использовать TCanvas.Handle в качестве HDC, создавая объект TBitmap и присваивая свойство Handle результату GetDC. Например:
var
hDC: HDC;
bmp: TBitmap;
begin
hDC := GetDC(hWnd);
bmp := TBitmap.Create;
try
bmp.Handle := hDC;
// Рисовать на битмапе с помощью методов TCanvas
finally
bmp.Free;
end;
end;
Код создает объект TBitmap, присваивает свойство Handle результату GetDC и использует методы TCanvas для рисования на битмапе. Обратите внимание, что вам нужно будет освободить объект TBitmap, когда вы закончите с ним.
Альтернативно можно использовать компонент WinAPI.Graphics32, который предоставляет более современный и легкий в использовании API для работы с графикой в Delphi:
uses
WinAPI.Graphics32;
procedure TForm1.GetScreenshot;
var
bitmap: TBitmap32;
begin
// Создать новый битмап
bitmap := TBitmap32.Create(Screen.Width, Screen.Height);
// Получить контекст устройства экрана
bitmap.Canvas.Handle := GetDC(hWnd);
// Рисовать на битмапе с помощью методов TCanvas
try
// ...
finally
FreeAndNil(bitmap);
end;
end;
Код создает новый объект TBitmap32, присваивает свойство Handle результату GetDC и использует методы TCanvas для рисования на битмапе. Обратите внимание, что вам нужно будет освободить объект TBitmap32, когда вы закончите с ним.
В статье описывается способ получения снимка экрана в Windows используя стандартный API, который включает в себя получение дескриптора рабочего стола и контекста экрана, а также освобождение ресурсов после выполнения задачи.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.