gpt4 book ai didi

delphi - 过去的 DWM 屏幕捕获到 TBitmap

转载 作者:行者123 更新时间:2023-12-03 15:36:20 24 4
gpt4 key购买 nike

我发现了一个演示应用程序,它能够使用 DwmRegisterThumbnail 获取最小化/隐藏窗口的屏幕截图。它工作完美,但结果图像是在表单本身而不是 TBitmap 中绘制的。

这是代码:

procedure TfrmMain.PreviewWindow(const ASource, ADest: HWND; const ARect: TRect);
var
LResult: HRESULT;
LThumpProp: DWM_THUMBNAIL_PROPERTIES;
begin
if NOT DwmCompositionEnabled then begin
MessageDlg('DWM composition is NOT enabled.', mtWarning, [mbOK], 0);
Exit;
end;

PreviewDisable;
FPreviewEnabled := Succeeded(DwmRegisterThumbnail(ADest, ASource, @FTumbnail));
if FPreviewEnabled then begin

LThumpProp.dwFlags := DWM_TNP_SOURCECLIENTAREAONLY or DWM_TNP_VISIBLE or
DWM_TNP_OPACITY or DWM_TNP_RECTDESTINATION;
LThumpProp.fSourceClientAreaOnly := False;
LThumpProp.fVisible := True;
LThumpProp.opacity := 200;
LThumpProp.rcDestination := ARect;
LResult := DwmUpdateThumbnailProperties(FTumbnail, LThumpProp);
FPreviewEnabled := (LResult = S_OK);
end else
MessageDlg('Cannot link to window ' + IntToStr(ASource), mtError, [mbOK], 0);
end;

该函数的调用方式如下:

PreviewWindow( TargetWindow.Handle,  Self.Handle,  LRect);

Reference

<小时/>

第二个参数是表单本身的句柄。到目前为止,我尝试使用 GetFormImage 但它没有捕获绘制捕获窗口的区域。我尝试通过以下方式将图像放入 TBitmap 但有两个问题:

          procedure TfrmMain.PreviewWindow(const ASource, ADest: HWND; const ARect: TRect);
var
LResult: HRESULT;
LThumpProp: DWM_THUMBNAIL_PROPERTIES;
Bitmap: TBitmap;
Width, Height: integer;
begin
if NOT DwmCompositionEnabled then begin
MessageDlg('DWM composition is NOT enabled.', mtWarning, [mbOK], 0);
Exit;
end; // if NOT DwmCompositionEnabled then begin
Bitmap := TBitmap.Create;

try
Width:=500; //default size....
Height:=500;
Bitmap.SetSize(Width, Height);

PreviewDisable;
//THE FOLLOWING LINE RETURN FALSE WHEN BITMAP.HANDLE IS USED INSTEAD OF ADest
FPreviewEnabled := Succeeded(DwmRegisterThumbnail(Bitmap.Handle, ASource, @FTumbnail));
if FPreviewEnabled then begin

LThumpProp.dwFlags := DWM_TNP_SOURCECLIENTAREAONLY or DWM_TNP_VISIBLE or
DWM_TNP_OPACITY or DWM_TNP_RECTDESTINATION;
LThumpProp.fSourceClientAreaOnly := False;
LThumpProp.fVisible := True;
LThumpProp.opacity := 200;
LThumpProp.rcDestination := ARect;
LResult := DwmUpdateThumbnailProperties(FTumbnail, LThumpProp);
FPreviewEnabled := (LResult = S_OK);
BitBlt(Bitmap.Canvas.Handle, 0, 0, Width, Height, ADest, 0, 0, SRCCOPY);
Bitmap.SaveToFile('d:\test.bmp'); //Test if the image is correct
end else
MessageDlg('Cannot link to window ' + IntToStr(ASource), mtError, [mbOK], 0);
finally
Bitmap.Free;
end;
end;

1.获取正确的尺寸

2.当使用TBitmap的句柄作为参数时,Succeeded返回false。

可以将图像放入 TBitmap 中吗?提前致谢。

已编辑:

我最后一次尝试使用TImage,然后将图像内容保存到文件中。但出现了白色的屏幕截图。

uses
dwmapi;

private
{ Private declarations }
thumb: PHTHUMBNAIL;

function UpdateThumb(aThumb: PHTHUMBNAIL; aDestRect: TRect):boolean;
var
size: PSize;
props: PDWM_THUMBNAIL_PROPERTIES;
begin
result:=true;
if aThumb <> nil then
begin
DwmQueryThumbnailSourceSize(aThumb^, size);
props.dwFlags:=DWM_TNP_VISIBLE and DWM_TNP_RECTDESTINATION and DWM_TNP_OPACITY;
props.fVisible:=true;
props.opacity:=50;
props.fSourceClientAreaOnly:=false;
props.rcDestination:= aDestRect;

if (size.cx < aDestRect.Right - aDestRect.Left) then props.rcDestination.Right:=props.rcDestination.Left+size.cx;
if (size.cy < aDestRect.Bottom - aDestRect.Top) then props.rcDestination.Top:=props.rcDestination.Left+size.cy;

DwmUpdateThumbnailProperties(aThumb^,props^);
end;

end;


procedure TForm1.btn1Click(Sender: TObject);
var
h: Hwnd;
r: TRect;
wwidth, wheight: integer;
i: integer;
begin
h:=FindWindow(nil,'Untitled - Notepad');

if h<>0 then
begin
GetWindowRect(h,r);
wwidth:=r.Right-r.Left;
wheight:=r.Bottom-r.Top;

if thumb <> nil then
begin
DwmUnregisterThumbnail(thumb^);
thumb := nil;
end;

i:=DwmRegisterThumbnail(img1.canvas.Handle,h,thumb);
if i=0 then
UpdateThumb(thumb, Rect(0,0,Img1.Width, Img1.Height));
end;

最佳答案

DwmRegisterThumbnail正在源窗口和目标窗口之间创建关系,以便当源窗口内容更改时,其更改会反射(reflect)在缩略图预览中。

如果您有窗口句柄,则可以使用 GetDC() 将其窗口视觉表示捕获为位图。和CreateCompatibleDC() , BitBlt() 。请参阅Capturing an Image

关于delphi - 过去的 DWM 屏幕捕获到 TBitmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35736080/

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