如何在多台显示器上正确切换全屏无边框

How to toggle fullscreen borderless on multiple monitors properly

我一直在寻找一种方法来根据 window 在全屏显示之前的位置正确选择我想要全屏显示的显示器。

我在网上找了很久,但找不到任何东西,所以我最终尝试了很多东西,直到我找到了一些东西。

我想有人最终会尝试查找这个问题,我不妨分享我的解决方案。

我最后做的是使用 LWJGL2 的显示 class 获取 window 中心的虚拟屏幕坐标,如下所示:

int x = Display.getX() + Display.getWidth()/2, 
    y = Display.getY() + Display.getHeight()/2;

然后我使用 AWT 获取所有可用的监视器:

GraphicsEnvironment.getLocalGraphicsEnvironment().getScreenDevices()

我遍历它们并获得它们的虚拟边界(并应用它们可能具有的任何 DPI 缩放):

Rectangle bounds = screenDevice.getDefaultConfiguration().getDefaultTransform().createTransformedShape(screenDevice.getDefaultConfiguration().getBounds()).getBounds();

编辑: 稍微修改了行,使其可以正确支持 Windows' DPI 缩放。

如果边界包含 window 的中心,这意味着大部分 window 可能在该监视器内:

if(bounds.contains(x,y))
    return bounds; //getMonitorFromWindow()

然后在 windowed 无边框全屏和正常 windowed 之间切换 LibGDX 我做了以下操作:

// config is the LwjglApplicationConfiguration of the application

// upon changing using alt+enter
if(fullscreen) {
    config.resizable = false;
    Gdx.graphics.setUndecorated(true);
    Rectangle monitor = getMonitorFromWindow();
    // set to full screen in current monitor
    Gdx.graphics.setWindowedMode(monitor.width, monitor.height);
    Display.setLocation(monitor.x, monitor.y);
} else {
    config.resizable = true;
    Gdx.graphics.setUndecorated(false);
    Rectangle monitor = getMonitorFromWindow();
    // set to windowed centered in current monitor
    Gdx.graphics.setWindowedMode((int) (monitor.width * 0.8f), (int) (monitor.height * 0.8f));
    Display.setLocation(monitor.x + (int) (monitor.width * 0.1f), monitor.y + (int) (monitor.height * 0.1f));
}

我希望有人会觉得这有用。