10

我发现通过继承 Windows 窗体鼠标点并减去窗口的高度和宽度来设置左侧和顶部(因为我的窗口的大小是固定的),这部分时间是有效的:

MyWindowObjectThatInheritsWindow window = new MyWindowObjectThatInheritsWindow();
System.Windows.Point mouseLocation = GetMousePositionWindowsForms();
window.Left = mouseLocation.X - 300;
window.Top = mouseLocation.Y - 240;
window.Show();

编辑:这是获取鼠标位置的代码...

public System.Windows.Point GetMousePositionWindowsForms()
{
    System.Drawing.Point point = System.Windows.Forms.Control.MousePosition;
    return new System.Windows.Point(point.X, point.Y);
}

请注意,这是通过使窗口的右下边缘接触鼠标光标的左上角来实现的。但这会因不同的屏幕分辨率或多台具有不同分辨率的显示器而中断?我还没有完全缩小范围,但我只是在另一台 PC 上尝试了相同的代码,它似乎生成的窗口不是鼠标光标的左上角,而是它的左下角,而且距离很远过了...

我可能应该将我的窗口大小添加到内容、宽度和高度,所以我不能只使用 ActualWidth 和 ActualHeight 属性,因为它们不可用。也许问题在于正确调整大小?有没有办法做到这一点?根据我的主 PC 和运行 1920x1080 分辨率的两台显示器,我确定 300 和 240 是正确的,因为我已经计算了我明确调整大小的窗口中所有对象的宽度和高度。编辑:刚刚尝试将高度和宽度明确设置为 240/300,以确保窗口不再按内容调整大小,并且在减去实际高度和宽度时我仍然遇到这个问题!

有任何想法吗?

4

3 回答 3

16

最后,这成功了:

        protected override void OnContentRendered(EventArgs e)
        {
            base.OnContentRendered(e);
            MoveBottomRightEdgeOfWindowToMousePosition();
        }

        private void MoveBottomRightEdgeOfWindowToMousePosition()
        {
            var transform = PresentationSource.FromVisual(this).CompositionTarget.TransformFromDevice;
            var mouse = transform.Transform(GetMousePosition());
            Left = mouse.X - ActualWidth;
            Top = mouse.Y - ActualHeight;
        }

        public System.Windows.Point GetMousePosition()
        {
            System.Drawing.Point point = System.Windows.Forms.Control.MousePosition;
            return new System.Windows.Point(point.X, point.Y);
        }
于 2013-11-05T01:54:53.590 回答
4

你不能使用这样的东西吗?:

Point mousePositionInApp = Mouse.GetPosition(Application.Current.MainWindow);
Point mousePositionInScreenCoordinates = 
    Application.Current.MainWindow.PointToScreen(mousePositionInApp);

我无法对其进行测试,但我认为它应该可以工作。


更新>>>

您不必Application.Current.MainWindow在这些方法中使用作为参数...如果您可以访问处理程序中的一个或另一个,它应该仍然有效:ButtonUIElement

Point mousePositionInApp = Mouse.GetPosition(openButton);
Point mousePositionInScreenCoordinates = openButton.PointToScreen(mousePositionInApp);

同样,我无法对此进行测试,但如果也失败了,那么您可以在如何在 WPF 中获取当前鼠标屏幕坐标中找到另一种方法?邮政。

于 2013-11-04T14:22:21.663 回答
2

您也可以通过稍微修改初始示例并在显示窗口之前定位窗口来做到这一点。

MyWindowObjectThatInheritsWindow window = new MyWindowObjectThatInheritsWindow();

var helper = new WindowInteropHelper(window);
var hwndSource = HwndSource.FromHwnd(helper.EnsureHandle());
var transformFromDevice = hwndSource.CompositionTarget.TransformFromDevice;

System.Windows.Point wpfMouseLocation = transformFromDevice.Transform(GetMousePositionWindowsForms());
window.Left = wpfMouseLocation.X - 300;
window.Top = wpfMouseLocation.Y - 240;
window.Show();
于 2017-07-06T13:37:43.707 回答