2014-09-01 72 views
1

如果您有一个可见的窗口可用,有关如何将屏幕转换为WPF坐标的Stackoverflow有几个回答问题。将屏幕转换为WPF坐标而不显示窗口

如果你的不是有一个可见的窗口(在我的情况下,一个托盘应用程序),你怎么能做转换?

我试图创建一个隐藏的虚拟窗口的非常不雅方法,

var w = new Window(); 
w.Visibility = Visibility.Hidden; 
presentationSource = PresentationSource.FromVisual(w); 
var transform = presentationSource.CompositionTarget.TransformToDevice; 
w.Close(); 

这是行不通的。必须显示窗口ww.Show(),以便PresentationSource.FromVisual工作。我也试过w.PointFromScreen(point),但是如果没有显示w则会引发异常。

+1

请参阅[此问题](http://stackoverflow.com/q/24441443/1136211)。 – Clemens 2014-09-02 06:22:30

回答

1

一半的答案是克莱门斯在上述评论的链接,这就是全部答案:

首先,你需要引用GetSystemMetrics的在USER32,这样你就可以得到实际屏幕尺寸:

public static int SM_CXSCREEN = 0; // GetSystemMetrics index. 
[DllImport("USER32.DLL", SetLastError = true)] 
public static extern int GetSystemMetrics(int nIndex); 

然后,得到WPF逻辑像素和物理像素之间的比例:

double widthInDevicePixels = WinApi.GetSystemMetrics(WinApi.SM_CXSCREEN); 
double widthInDIP = SystemParameters.WorkArea.Right; // Device independent pixels. 
double scalingFactor = widthInDIP/widthInDevicePixels; 

...这就是它:

double wpfLogicalPixel = devicePixel * scalingFactor;