gpt4 book ai didi

delphi - 用delphi在屏幕截图中显示鼠标光标

转载 作者:行者123 更新时间:2023-12-03 15:19:58 32 4
gpt4 key购买 nike

嗨,我正在制作一个delphi xe功能,该功能是截图,一切顺利,但问题是我在任何拍摄的图像上都看不到鼠标光标。

代码如下:

procedure capturar_pantalla(nombre: string);

// Credits :
// Based on : http://www.delphibasics.info/home/delphibasicssnippets/screencapturewithpurewindowsapi
// Thanks to www.delphibasics.info and n0v4

var

uno: integer;
dos: integer;
cre: hDC;
cre2: hDC;
im: hBitmap;
archivo: file of byte;
parriba: TBITMAPFILEHEADER;
cantidad: pointer;
data: TBITMAPINFO;

begin


// Start

cre := getDC(getDeskTopWindow);
cre2 := createCompatibleDC(cre);
uno := getDeviceCaps(cre, HORZRES);
dos := getDeviceCaps(cre, VERTRES);
zeromemory(@data, sizeOf(data));


// Config

with data.bmiHeader do
begin
biSize := sizeOf(TBITMAPINFOHEADER);
biWidth := uno;
biheight := dos;
biplanes := 1;
biBitCount := 24;

end;

with parriba do
begin
bfType := ord('B') + (ord('M') shl 8);
bfSize := sizeOf(TBITMAPFILEHEADER) + sizeOf(TBITMAPINFOHEADER)
+ uno * dos * 3;
bfOffBits := sizeOf(TBITMAPINFOHEADER);
end;

//

im := createDIBSection(cre2, data, DIB_RGB_COLORS, cantidad, 0, 0);
selectObject(cre2, im);

bitblt(cre2, 0, 0, uno, dos, cre, 0, 0, SRCCOPY);

releaseDC(getDeskTopWindow, cre);

// Make Photo

AssignFile(archivo, nombre);
Rewrite(archivo);

blockWrite(archivo, parriba, sizeOf(TBITMAPFILEHEADER));
blockWrite(archivo, data.bmiHeader, sizeOf(TBITMAPINFOHEADER));
blockWrite(archivo, cantidad^, uno * dos * 3);

end;

当我让鼠标光标出现在屏幕截图中时,有人可以解释一下吗?

最佳答案

这是您尝试执行的操作的更清晰的实现,以及演示如何使用它的控制台应用程序。 (由于捕获屏幕的时间,它会捕获“应用程序忙”光标,因为调用是在应用程序仍在加载时进行的。)您可以在需要时弄清楚如何调用它,以便获得正确的信息光标。

鼠标光标捕获归功于 Zarko(托尼的链接)。我不久前在此处找到的屏幕捕获代码(并且有给作者的积分,但它在另一台机器上) - 明天我回到该系统时会更新这篇文章。

program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils, Windows, Graphics;

procedure DrawCursor (ACanvas:TCanvas; Position:TPoint) ;
var
HCursor : THandle;
begin
HCursor := GetCursor;
DrawIconEx(ACanvas.Handle, Position.X, Position.Y,
HCursor, 32, 32, 0, 0, DI_NORMAL) ;
end;

function CaptureWindow(const WindowHandle: HWnd): TBitmap;
var
DC: HDC;
wRect: TRect;
CurPos: TPoint;
begin
DC := GetWindowDC(WindowHandle);
Result := TBitmap.Create;
try
GetWindowRect(WindowHandle, wRect);
Result.Width := wRect.Right - wRect.Left;
Result.Height := wRect.Bottom - wRect.Top;
BitBlt(Result.Canvas.Handle,
0,
0,
Result.Width,
Result.Height,
DC,
0,
0,
SRCCOPY);
GetCursorPos(CurPos);
DrawCursor(Result.Canvas, CurPos);
finally
ReleaseDC(WindowHandle, DC);
end;
end;

// Sample usage starts here
var
Bmp: TBitmap;

begin
Bmp := CaptureWindow(GetDesktopWindow);
Bmp.SaveToFile('D:\TempFiles\FullScreenCap.bmp');
Bmp.Free;
WriteLn('Screen captured.');
ReadLn;
end.

关于delphi - 用delphi在屏幕截图中显示鼠标光标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21971605/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com