Я хочу установить положение процесса в центре экрана, чтобы оно охватывало весь экран. Для этого я вызываю функцию 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();
}