我试图在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()值差)。
因此,经过大量游戏后我可以找到所有不同的选项,我对如何在窗口上获取正确的值感到茫然。
答案 0 :(得分:0)
我可以使用以下内容,但我希望有人可以提供一个很好的解释:
var transform = PresentationSource.FromVisual(PacksApp.Current.MainWindow).CompositionTarget.TransformFromDevice;
var pointOfMouse = transform.Transform(GetCursorPos());