Múltiplas janelas do explorador com posicionamento e tamanho.

Devido ao meu trabalho, necessito de ter muitas janelas do explorador abertas e distribuídas por um ecrã. Esta era uma tarefa bastante cansativa para todas as vezes que ligava o computador.

Decidi criar um script em powershell para resolver esta questão e abrir múltiplas janelas de explorador e distribuir pelo ecrã.

Isto porque como são janelas com localizações de rede, davam erro quando abriam pois ainda não tinha acesso a essas localizações quando arrancava o Windows. Desta forma posso correr o script quando necessitar e a qualquer altura.

Criem um ficheiro com a extensão .ps1 que corresponde a código de Powershell.

Add-Type @"
    using System;
    using System.Runtime.InteropServices;
    public class Win {
        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, out uint processId);
    }
"@

# Define the array with folder locations and window properties (Top, Left, Width, Height)
$windows = @(
    @{Location="C:\"; Top=0; Left=100; Width=800; Height=600},
    @{Location="D:\"; Top=200; Left=300; Width=800; Height=600},
    @{Location="E:\"; Top=300; Left=500; Width=800; Height=600}
)

# Create the Shell.Application COM object
$shell = New-Object -ComObject Shell.Application

# Loop through each location and its window properties
foreach ($window in $windows) {
    # Open the folder
    $shell.Open($window.Location)

    # Wait briefly to ensure the window has opened
    Start-Sleep -Seconds 2

    # Get the collection of open windows from the Shell.Application object
    $openWindows = $shell.Windows()

    # Loop through each open window and check for the correct folder path
    foreach ($explorerWindow in $openWindows) {
        try {
            if ($explorerWindow.Document.Folder.Self.Path -eq $window.Location) {
                # Get the handle (hWnd) of the Explorer window
                $hWnd = $explorerWindow.HWND

                # Move and resize the window
                [Win]::MoveWindow($hWnd, $window.Left, $window.Top, $window.Width, $window.Height, $true)
                Write-Host "Moved window for $($window.Location) to position [$($window.Left), $($window.Top)] with size [$($window.Width)x$($window.Height)]"
                break
            }
        } catch {
            # If there's an error accessing the Document or Folder, skip this window
            Write-Host "Error accessing window for $($window.Location). Skipping..."
        }
    }
}

Desta forma posso adicionar e remover janelas de explorador e escolher qual a localização e tamanho no ecrã de cada janela. Para isso basta mudar a array com as localizações das janelas:

$windows = @(
    @{Location="C:\"; Top=0; Left=100; Width=800; Height=600},
    @{Location="D:\"; Top=200; Left=300; Width=800; Height=600},
    @{Location="E:\"; Top=300; Left=500; Width=800; Height=600}
)

Como exemplo da primeira localização, vai abrir uma janela em “C:\” na posição de topo 0 e a 100px da margem esquerda. A janela vai ter o tamanho de 800px de largura e 600px de altura.

Podem mudar esta array para as vossas necessidades.

O código deste script de powershell está disponível no GitHub

Espero ter ajudado.

Pode fazer uma doação para ajudar a mater o site, Obrigado!