用OpenTK改变启动监视器的正确方法是什么?



我试图获得NativeWindowSettings的CurrentMonitor属性来改变它创建窗口的监视器。我试着在我的二级显示器上显示,这是我所拥有的:

var nativeWindowSettings = new NativeWindowSettings()
{
Size = new OpenTK.Mathematics.Vector2i(800, 600),
Title = "My Window",
Flags = OpenTK.Windowing.Common.ContextFlags.ForwardCompatible,
CurrentMonitor = new Monitors.GetMonitors()[1].Handle, //problem

};
using (var window = new Game(GameWindowSettings.Default, nativeWindowSettings))
{
window.Run();
}

我试过创建一个新的监视器句柄并将其分配给它,我试过使用监视器数组中第二个监视器的指针创建一个新的MonitorHandle。

CurrentMonitor = new MonitorHandle(Monitors.GetMonitors()[1].Handle.Pointer),

这取决于操作系统。并不是所有的窗口系统都能指定新创建的窗口将出现在哪个屏幕上,也不是所有的窗口系统都会注意这个参数。正如他们所说,你的里程可能会有所不同。你没有指定你使用的是哪个操作系统,所以接下来我就假设它是某种风格的微软Windows。

在MS Windows上,你不能指定你的新窗口出现在哪个屏幕上,而不能同时指定窗口在屏幕上应该出现的位置:如果你让Windows选择坐标,它会每次都把窗口放在主屏幕上,就像你看到的那样。

因此,至少在MS Windows上,正确的方法是首先找出要在其上创建窗口的屏幕的虚拟坐标(MonitorInfo)。你可以从它的ClientArea(整个屏幕的虚拟坐标)或WorkArea(屏幕可用部分的虚拟坐标,减去任务栏之类的东西)中进行选择。在任何一种情况下,每个MonitorInfo的矩形都将是一个独特的虚拟屏幕空间块,不与任何其他的重叠。

一旦你找到了你想要创建窗口的屏幕矩形,你只需在上的上的NativeWindowSettings中指定Location,在ClientAreaWorkArea的坐标内:可能在顶部角落,或者,如果你想更聪明一点,你可以做一些数学运算并将窗口置于虚拟矩形的中心。唯一你不能容易做到的是操作系统的"级联"行为,你的窗口将被赋予一个新的位置,与屏幕上的其他窗口不同,但不是真正的居中,也不是真正在上角;这种行为是窗口系统内置的,没有办法直接访问或影响它。

但情况并非如此:您不指定监视器:您在监视器上指定Location,然后窗口将出现在那里。这也不是OpenTK的事情:这只是微软Windows多显示器设置的方式。

相关内容

最新更新