Центровка окон Windows

Если вы, как и я любите порядок на рабочем столе и во время работы, то положение окна приложения по центру экрана — очень интересная идея и практика.

Открыл окно, потом другое и так дальше, поэтому создаётся разнобой в положении окон на рабочем столе. А, согласитесь, как красиво, когда нужное окошко, в котором работаете сейчас находится ровно по середине — в центре экрана.

Задавшись решением такой задачи я нашёл готовое приложение, которое работает в свёрнутом виде — Window Centering Helper. Приложение имеет и портативную версию, которой для такой простой задачи, вполне, достаточно.

Программа имеет ряд настроек, которые определяют автоматическую и ручную центровку окон. Например, можно трижды нажать правую клавишу «Shift» на клавиатуре и активное окно встанет по центру.

Центровка окон Windows

Скачать 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

Можете сохранить этот скрипт в файле *.vbs и поместить этот файл в автозагрузку:

  1. Открыть окно «Выполнить» (сочетание клавиш: Win+R).
  2. Ввести команду shell:startup.
  3. Нажать «ОК» или «Enter» для выполнения команды.

Или можно запускать этот файл самостоятельно по мере необходимости. Чтобы завершить работу скрипта в диспетчере задач в строке поиска введите powershell и завершите процесс Windows PowerShell — «powershell.exe«.