DWM API:某些计算机上的目标位置不正确

本文关键字:目标 位置 不正确 计算机 API DWM | 更新日期: 2023-09-27 17:51:02

我使用DWM API在我的WPF应用程序中显示其他窗口的缩略图。在大多数计算机上它工作得很好,但在某些计算机上,我的缩略图在应用程序中定位错误且较小(它向左+向上移动了几个像素,大约小30%)。

对于创建缩略图关系,我使用以下代码(和dwmapi.dll):

if (DwmRegisterThumbnail(IntPtr dest, IntPtr src, out IntPtr thumb) != 0) return;
PSIZE size;
DwmQueryThumbnailSourceSize(m_hThumbnail, out size);
DWM_THUMBNAIL_PROPERTIES props = new DWM_THUMBNAIL_PROPERTIES
{
   fVisible = true,
   dwFlags = DwmApiConstants.DWM_TNP_VISIBLE | DwmApiConstants.DWM_TNP_RECTDESTINATION | DwmApiConstants.DWM_TNP_OPACITY,
   opacity = 0xFF,
   rcDestination = destinationRect
};
DwmUpdateThumbnailProperties(m_hThumbnail, ref props);

对于在我的应用程序中的定位,我使用的是一个画布,它的位置我使用:

var generalTransform = PreviewCanvas.TransformToAncestor(App.Current.MainWindow);
var leftTopPoint = generalTransform.Transform(new Point(0, 0));
return new System.Drawing.Rectangle((int)leftTopPoint.X, (int)leftTopPoint.Y, (int)PreviewCanvas.ActualWidth, (int)PreviewCanvas.ActualHeight);

DWM API:某些计算机上的目标位置不正确

感谢Hans,这是dip -> px转换的问题(我认为WPF尺寸是由像素表示的)。

所以,我改变了

return new System.Drawing.Rectangle(
  (int)leftTopPoint.X, 
  (int)leftTopPoint.Y, 
  (int)PreviewCanvas.ActualWidth, 
  (int)PreviewCanvas.ActualHeight
);

:

using (var graphics = System.Drawing.Graphics.FromHwnd(IntPtr.Zero))
{
    return new System.Drawing.Rectangle(
      (int)(leftTopPoint.X * graphics.DpiX / 96.0),
      (int)(leftTopPoint.Y * graphics.DpiY / 96.0), 
      (int)(PreviewCanvas.ActualWidth * graphics.DpiX / 96.0),
      (int)(PreviewCanvas.ActualHeight * graphics.DpiY / 96.0)
     );
}

,现在缩略图的位置和大小在所有设备上都是正确的