如果您有可见的可用窗口,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
未显示,则会引发异常。
答案 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;