DwmRegisterThumbnail到TBitmap

时间:2014-11-15 10:19:51

标签: delphi delphi-xe

我找到了一个演示应用程序,它可以使用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,但我有两个问题:1。获取正确的大小,2。当TBitmap的句柄用作参数时,Succeeded返回false。

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;

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

0 个答案:

没有答案