2015-05-29 70 views
1

我使用DWM API在我的WPF應用程序顯示其它窗口的縮略圖不正確的目標位置。在大多數電腦上它工作正常,但在某些電腦上,我的縮略圖在應用程序中的位置偏移較小(它移動了幾個像素左+增加了約30%)。DWM API:在某些計算機

要創建我使用這個代碼(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); 
+1

您鑄造英寸像素。當視頻適配器DPI未設置爲96dpi(100%)時,這不起作用。 Google「wpf將英寸轉換爲像素」,首先打中看起來不錯。 –

回答

0

由於漢斯,它是與浸漬的問題 - > PX轉換(I認爲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) 
    ); 
} 

現在位置和縮略圖的大小在所有設備上正確的。

相關問題