Если вы, как и я любите порядок на рабочем столе и во время работы, то положение окна приложения по центру экрана — очень интересная идея и практика.
Открыл окно, потом другое и так дальше, поэтому создаётся разнобой в положении окон на рабочем столе. А, согласитесь, как красиво, когда нужное окошко, в котором работаете сейчас находится ровно по середине — в центре экрана.
Задавшись решением такой задачи я нашёл готовое приложение, которое работает в свёрнутом виде — Window Centering Helper. Приложение имеет и портативную версию, которой для такой простой задачи, вполне, достаточно.
Программа имеет ряд настроек, которые определяют автоматическую и ручную центровку окон. Например, можно трижды нажать правую клавишу «Shift» на клавиатуре и активное окно встанет по центру.

Скачать Window Centering Helper
- Имя файла: WindowCenteringHelper-PE.exe (прямая ссылка)
- Версия: 1.2.11 beta
- Размер файла: 1,3 МБайт
- Требование: OS Windows 7/8.1/10/11
- MD5: a730d2d86ded709c737c3a45204fe549
Есть одно важное «НО». Программа очень давно не обновлялась, имеет пользовательский интерфейс только на английском языке (может быть для кого-то это важно) и не имеет возможности работать в полностью скрытом режиме.
Скрипт для центровки
Для себя я нашёл другое решение — самописный скрипт. Он работает полностью автоматически м не отображается в система совсем (без иконок в системном трее).
Код скрипт для центровки
‘ Silent Window Centerer Launcher (Final Version)
‘ Автор: Илья Анисимов
‘ Web: https://iluh.in
‘ Запускает центрирование окон с исправленной логикойSet objShell = CreateObject(«WScript.Shell»)
‘ Проверяем, запущен ли уже процесс
Set objWMI = GetObject(«winmgmts:»)
Set colProcesses = objWMI.ExecQuery(«SELECT * FROM Win32_Process WHERE Name = ‘powershell.exe’ AND CommandLine LIKE ‘%WindowCentererSilent%'»)If colProcesses.Count > 0 Then
WScript.Quit
End If‘ PowerShell команда с исправленной переменной
psCommand = «powershell.exe -WindowStyle Hidden -NoProfile -ExecutionPolicy Bypass -Command «»» & _
«$Host.UI.RawUI.WindowTitle = ‘WindowCentererSilent’; » & _
«Add-Type -AssemblyName System.Windows.Forms; » & _
«Add-Type -TypeDefinition ‘using System; using System.Runtime.InteropServices; » & _
«public class Win32 { » & _
«[DllImport(\»»user32.dll\»»)] public static extern IntPtr GetForegroundWindow(); » & _
«[DllImport(\»»user32.dll\»»)] public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); » & _
«[DllImport(\»»user32.dll\»»)] public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); » & _
«[DllImport(\»»user32.dll\»»)] public static extern bool IsWindowVisible(IntPtr hWnd); » & _
«[DllImport(\»»user32.dll\»»)] public static extern bool IsZoomed(IntPtr hWnd); » & _
«[DllImport(\»»user32.dll\»»)] public static extern bool IsIconic(IntPtr hWnd); » & _
«[DllImport(\»»user32.dll\»»)] public static extern IntPtr GetParent(IntPtr hWnd); » & _
«[DllImport(\»»dwmapi.dll\»»)] public static extern int DwmGetWindowAttribute(IntPtr hwnd, int dwAttribute, out bool pvAttribute, int cbAttribute); » & _
«[DllImport(\»»user32.dll\»»)] public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); » & _
«[StructLayout(LayoutKind.Sequential)] public struct RECT { public int Left; public int Top; public int Right; public int Bottom; } » & _
«public const uint SWP_NOSIZE = 0x0001; public const uint SWP_NOZORDER = 0x0004; » & _
«public const int DWMWA_CLOAKED = 14; }’; » & _
«$screen = [System.Windows.Forms.Screen]::PrimaryScreen.WorkingArea; » & _
«$excludeProcesses = @(‘ShellExperienceHost’, ‘SearchHost’, ‘StartMenuExperienceHost’, ‘LockApp’, ‘SystemSettings’, ‘explorer’); » & _
«function Center-Window($hWnd) { » & _
«if ($hWnd -eq [IntPtr]::Zero -or -not [Win32]::IsWindowVisible($hWnd) -or [Win32]::IsZoomed($hWnd) -or [Win32]::IsIconic($hWnd) -or [Win32]::GetParent($hWnd) -ne [IntPtr]::Zero) { return } » & _
«try { $isCloaked = $false; » & _
«[Win32]::DwmGetWindowAttribute($hWnd, [Win32]::DWMWA_CLOAKED, [ref]$isCloaked, [System.Runtime.InteropServices.Marshal]::SizeOf([bool])) | Out-Null; » & _
«if ($isCloaked) { return } } catch {} » & _
«$processId = 0; [Win32]::GetWindowThreadProcessId($hWnd, [ref]$processId) | Out-Null; if ($processId -eq 0) { return } » & _
«try { $processName = (Get-Process -Id $processId -ErrorAction Stop).ProcessName; if ($excludeProcesses -contains $processName) { return } } catch { return } » & _
«$rect = New-Object Win32+RECT; » & _
«if (-not [Win32]::GetWindowRect($hWnd, [ref]$rect)) { return } » & _
«$width = $rect.Right — $rect.Left; $height = $rect.Bottom — $rect.Top; » & _
«if ($width -le 80 -or $height -le 40 -or $width -ge $screen.Width -or $height -ge $screen.Height) { return } » & _
«$newX = [math]::Max(0, ($screen.Width — $width) / 2 + $screen.Left); » & _
«$newY = [math]::Max(0, ($screen.Height — $height) / 2 + $screen.Top); » & _
«[Win32]::SetWindowPos($hWnd, [IntPtr]::Zero, [int]$newX, [int]$newY, 0, 0, [Win32]::SWP_NOSIZE -bor [Win32]::SWP_NOZORDER) | Out-Null; } » & _
«$lastWindow = [IntPtr]::Zero; » & _
«while ($true) { » & _
«try { » & _
«$hWnd = [Win32]::GetForegroundWindow(); » & _
«if ($hWnd -ne $lastWindow) { » & _
«$lastWindow = $hWnd; » & _
«Start-Sleep -Milliseconds 150; » & _
«Center-Window $hWnd; » & _
«} } catch { } » & _
«Start-Sleep -Milliseconds 300; }»»»‘ Запускаем PowerShell скрыто
objShell.Run psCommand, 0, False
Можете сохранить этот скрипт в файле *.vbs и поместить этот файл в автозагрузку:
- Открыть окно «Выполнить» (сочетание клавиш: Win+R).
- Ввести команду shell:startup.
- Нажать «ОК» или «Enter» для выполнения команды.
Или можно запускать этот файл самостоятельно по мере необходимости. Чтобы завершить работу скрипта в диспетчере задач в строке поиска введите powershell и завершите процесс Windows PowerShell — «powershell.exe«.