12

我有 2 个显示器和一个启动 WPF 窗口的 WinForm 应用程序。我想获取 WinForm 所在的屏幕,并在同一屏幕上显示 WPF 窗口。我怎样才能做到这一点?

4

4 回答 4

14

WPF 不包括方便的 System.Windows.Forms。Screen类,但您仍然可以使用它的属性在 WinForms 应用程序中完成任务。

假设意味着 WinForms 窗口和_wpfWindow是一个定义的变量,在下面的示例中引用 WPF 窗口(这将在您设置为打开 WPF 窗口的任何代码处理程序中,如某些 Button.Click 处理程序):

Screen screen = Screen.FromControl(this);
_wpfWindow.StartupLocation = System.Windows.WindowStartupLocation.Manual;
_wpfWindow.Top = screen.Bounds.Top;
_wpfWindow.Left = screen.Bounds.Left;
_wpfWindow.Show();

上面的代码将在包含 WinForms 窗口的屏幕左上角实例化 WPF 窗口。如果您希望将其放置在另一个位置(例如屏幕中间)或以“层叠”样式放置在 WinForms 窗口下方和右侧,我将把数学留给您。

在屏幕中间获取 WPF 窗口的另一种方法是简单地使用

_wpfWIndow.StartupLocation = System.Windows.WindowStartupLocation.CenterScreen

但是,这并不那么灵活,因为它使用鼠标的位置来确定显示 WPF 窗口的屏幕(显然,如果用户快速移动鼠标,鼠标可能与 WinForms 应用程序位于不同的屏幕上,或者您使用默认按钮或其他)。

编辑:这是关于使用 InterOp 使您的 WPF 窗口居中于非 WPF 窗口的 SDK 文档的链接。它基本上完成了我在计算数学方面所描述的内容,但正确地允许您使用窗口的 HWND 设置 WPF 窗口的“所有者”属性。

于 2009-02-04T18:38:35.470 回答
6

这是最简单的方法(使用 WindowStartupLocation.CenterOwner)。

MyDialogWindow dialogWindow = new MyDialogWindow();
dialogWindow.Owner = this;
dialogWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;

dialogWindow.ShowDialog();

无需互操作或设置窗口坐标 :)

于 2009-03-25T01:13:44.877 回答
3

另一种方法是:

WindowInteropHelper helper = new WindowInteropHelper(this);

this.StartupLocation = System.Windows.WindowStartupLocation.Manual;
this.Left = System.Windows.Forms.Screen.FromHandle(helper.Handle).Bounds.Left;
this.Top = System.Windows.Forms.Screen.FromHandle(helper.Handle).Bounds.Top;

这 = 你的 WPF 窗口...

于 2012-08-29T03:46:48.447 回答
1

您应该能够使用 System.Windows.Forms.Screen [1],并使用 FromControl 方法获取表单的屏幕信息。然后,您可以使用它根据您尝试定位的屏幕来定位 WPF 窗口(顶部,左侧)。

[1] 如果您不加载 WinForms dll,您也可以使用 win32 MonitorFromRect 等。但是,由于您已经获得了 winforms API,因此您无需支付任何内存/性能损失。

于 2009-02-04T18:50:08.037 回答