@iluhin

0 %
Ilya Anisimov
Développement front-end
Réparation douce/dure
  • Ville:
    Mourmansk
  • Âge:
    41 ans
  • Éducation:
    Plus haut
  • Famille:
    Célibataire
  • Enfants:
    Non
WordPress
PHP/JS
HTML/CSS
Microsoft 365
Bitrix24
1C : Entreprise
Compétences
  • Gestion du personnel
  • Formation du personnel
  • Technique de vente
  • Discipline de trésorerie
  • Inventaire

Centrage des fenêtres Windows

30.09.2025

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

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

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

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

Скачать Window Centering Helper

  • Nom de fichier: WindowCenteringHelper-PE.exe (lien direct)
  • Version: 1.2.11 beta
  • Taille du fichier: 1,3 МБайт
  • Exigence: Système d'exploitation Windows 7/8.1/10/11
  • MD5: a730d2d86ded709c737c3a45204fe549

Есть одно важное “НО”. Программа очень давно не обновлялась, имеет пользовательский интерфейс только на английском языке (может быть для кого-то это важно) и не имеет возможности работать в полностью скрытом режиме.

Скрипт для центровки

Для себя я нашёл другое решение – самописный скрипт. Он работает полностью автоматически м не отображается в  система совсем (без иконок в системном трее).

				
					' Silent Window Centerer Launcher (Final Version)
' Запускает центрирование окон с исправленной логикой

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
' Автор: Илья Анисимов
' Web: https://iluh.in
				
			

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

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

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

Publié dans СофтMots clés :