设置窗口位置以在WPF中跟踪光标的问题

时间:2018-03-25 15:58:26

标签: c# .net wpf windows

我试图在WPF中执行拖放操作。我清楚地记得我经常做这类事情的日子。

我使用GetCursorPos()的p / invoke来返回屏幕坐标。这个数字相当于光标偏移。

由于我的笔记本电脑的高DPI设置(120),我认为该问题正在缩放,因此我使用了以下代码(从this被盗):

private Point ConvertPixelsToUnits(int x, int y)
{
// get the system DPI
IntPtr dDC = GetDC(IntPtr.Zero); // Get desktop DC
int dpi = GetDeviceCaps(dDC, 88);
bool rv = ReleaseDC(IntPtr.Zero, dDC);

// WPF's physical unit size is calculated by taking the 
// "Device-Independant Unit Size" (always 1/96)
// and scaling it by the system DPI
double physicalUnitSize = (1d / 96d) * (double)dpi;
Point wpfUnits = new Point(physicalUnitSize * (double)x,
    physicalUnitSize * (double)y);

return wpfUnits;          
}

虽然p / invokes的dpi值是正确的,但结果却是偏离的方式(明显比使用原始GetCursorPos()值差)。

因此,经过大量游戏后我可以找到所有不同的选项,我对如何在窗口上获取正确的值感到茫然。

1 个答案:

答案 0 :(得分:0)

我可以使用以下内容,但我希望有人可以提供一个很好的解释:

var transform = PresentationSource.FromVisual(PacksApp.Current.MainWindow).CompositionTarget.TransformFromDevice;
var pointOfMouse = transform.Transform(GetCursorPos());