- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我发现了一个演示应用程序,它能够使用 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);
<小时/>
第二个参数是表单本身的句柄。到目前为止,我尝试使用 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/
我正在执行以下操作将 TBitmap(Firemonkey) 转换为字符串: function BitmapToBase64(Bitmap: Tbitmap): string; var BS: T
为了加快在 Delphi XE2 中绘制位图,我决定采用以下方式 a)创建一个例如。 10 x 线程并仅在线程类内绘制一层位图 b)一旦所有线程完成,使用bitblt函数逐层合并位图 我做了以下实验代
请考虑以下代码: type TBaseControl = class(TWinControl) private FBitmap : TBitmap; public cons
我有一个要在 TPaintBox 上绘制的位图。问题是我之前必须将其旋转到特定角度。我决定使用 TBitmap32。 我是这样做的:我首先创建一个 TBitmap,然后将其传输到 TBitmap32,
我使用Delphi 10.3。 这段代码工作得很好。它加载带有 Alpha channel 的 32 位 BMP,并以适当的透明度显示: Bmp := TBitmap.Create; Bmp.Alph
我编写了一个例程,应该向位图添加点线边框: procedure AddDottedBorderToBitmap(aBM: Vcl.Graphics.TBitmap); var c: TCanvas
FMX.Types.TBitmap类有 ScanLine FMX (FireMonkey) 中的属性,但似乎该属性已被删除,并且在 FMX2 (FireMonkey FM2) 中丢失。 有什么解决办法
有没有比逐像素检查更好的方法? 最佳答案 您可以将两个位图保存到 TMemoryStream 并使用 CompareMem 进行比较: function IsSameBitmap(Bitmap1, B
在相机应用程序中,位图像素阵列是从流式相机中检索的。 通过将像素数组写入命名管道来捕获像素数组,在管道的另一端,ffmpeg 检索它们并创建一个 AVI 文件。 我将需要创建一个自定义帧(启用自定义文
我通过 TCameraComponent.SampleBufferReady 事件收到位图。然后我需要裁剪接收到的图像,以便获得例如矩形图像。 我用以下方法计算了必要的参数: procedure TP
我有一个获取屏幕截图的例程(TBitmap),我需要向最终的 TBitmap/图像添加阴影,我有这段代码(以前可以工作,但是......)有些不对劲,下降- 根本不绘制阴影: // ---------
在 Delphi 中,FireMonkey 的 TBitmap.BitmapScale 属性的用途是什么? Embarcadero 的文档对此只字未提。 最佳答案 它控制位图渲染的比例,例如在 TIm
我正在努力将具有透明度的 TBitmap 绘制到 TDirect2DCanvas 上而不丢失透明度。 创建了一个 TBitmap ,它充当我的绘图操作的后台缓冲区,如下所示: bmp := TBitm
我正在从 TImageList 中的资源加载多个图像在运行时使用此代码: Bitmap:=TBitmap.Create; MyIcons:=TImageList.Create(self); Bi
我想在 KOL 中将 TBitMap 转换为 PBitMap。 我试过这个,但我得到一张黑色图片作为输出: function TbitMapToPBitMap (bitmap : TBitMap) :
这个问题在这里已经有了答案: Why are Delphi objects assigned even after calling .Free? (4 个答案) 关闭 5 年前。 我在 VCL Fo
我有一个由 11 个白色 TBitmap 组成的数组(32 位 512x512 像素 = 1 MB)我想将它们分配给 TPngImage 数组以减少内存使用,我预计 1 mb 白色位图会变成 1.76
我有一个应用程序,可以在打印机上将文本和图像打印到页面上。在页脚处,我们输出一个图像,该图像通过加载一次进行缓存,并存储在 TBitmap 中。在打印例程中,它创建一个新的 TBitmap,然后调用一
我发现了一个演示应用程序,它能够使用 DwmRegisterThumbnail 获取最小化/隐藏窗口的屏幕截图。它工作完美,但结果图像是在表单本身而不是 TBitmap 中绘制的。 这是代码: pro
我想提取 GIF 图像的帧。下面的代码可以工作,但这不是我需要的。我需要将提取的帧保留在一系列位图中。 procedure TForm1.Button2Click(Sender: TObject);
我是一名优秀的程序员,十分优秀!