Надежное центрирование окна с помощью Windows API - PullRequest
0 голосов
/ 11 ноября 2018

Я хочу установить положение процесса в центре экрана, чтобы оно охватывало весь экран. Для этого я вызываю функцию SetWindowPos() Windows API, используя 0 для параметров x, y, cx и cy. На моем ноутбуке с разрешением 1600x900 это работает не совсем так, как ожидалось. Слева все еще примерно 1011 * пикселей, не занятых окном. Это можно легко исправить, установив x в -8, чтобы окно было смещено немного влево. У меня вопрос, как установить положение окна на каждом разрешении / ноутбуке / ПК, чтобы окно идеально покрывало весь экран (как если бы оно было в полноэкранном режиме, но без использования полноэкранного режима). Кроме того, почему использование всех параметров позиционирования как 0 не обеспечивает надежной работы? Это работает на некоторых устройствах? Может быть, просто мой ноутбук ведет себя странно в этом отношении, но он должен работать на всех устройствах.

Вот код, который я использую Java JNA, который также может пригодиться:

public static void centerWindow(String windowTitle)
{
    val benchmarkTimer = new BenchmarkTimer();
    val windowHandle = getWindowHandle(windowTitle);
    centerWindowInternal(windowHandle, benchmarkTimer);
}

private static void centerWindowInternal(HWND windowHandle, BenchmarkTimer benchmarkTimer)
{
    val flags = SWP_NOSIZE | SWP_NOZORDER;
    val succeeded = User32.INSTANCE.SetWindowPos(windowHandle, null, -8, 0, 0, 0, flags);
    if (!succeeded)
    {
        checkForKernelError();

        if (benchmarkTimer.isExpired(15_000))
        {
            throw new IllegalStateException("Centering window failed");
        } else
        {
            centerWindowInternal(windowHandle, benchmarkTimer);
        }
    }
}

private static HWND getWindowHandle(String windowTitle)
{
    val windowHandle = new AtomicReference<HWND>();
    EnumWindows((handle, pointer) ->
    {
        val windowTextBuffer = new char[WINDOW_TEXT_BUFFER_SIZE];
        GetWindowTextW(handle, windowTextBuffer, WINDOW_TEXT_BUFFER_SIZE);
        val currentWindowText = Native.toString(windowTextBuffer);

        if (currentWindowText.equals(windowTitle))
        {
            windowHandle.set(handle);
            return false;
        }
        return true;
    }, null);

    return windowHandle.get();
}
...