将屏幕转换为WPF坐标而不显示窗口

时间:2014-09-01 22:33:50

标签: c# wpf

如果您有可见的可用窗口,Stackoverflow上有几个关于如何将屏幕转换为WPF坐标的问题。

如果您没有拥有可见的窗口(在我的情况下,托盘应用程序中),您如何进行转换?

我尝试过创建隐藏虚拟窗口的非常不优雅的方法,

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

这不起作用。必须显示w窗口w.Show()才能使PresentationSource.FromVisual生效。我还尝试了w.PointFromScreen(point),但如果w未显示,则会引发异常。

1 个答案:

答案 0 :(得分:1)

答案的一半是在克莱门斯'在上面的评论中链接,这是完整的答案:

首先,您需要在USER32中引用GetSystemMetrics,以便获得物理屏幕尺寸:

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;