Откройте Firefox поверх всего с PowerShell

407
daniel gon

Я запускаю два сценария.

. C:\path/Set-Window.ps1 Start-Process -FilePath 'C:/Program Files/Mozilla Firefox/firefox.exe' -ArgumentList https://stackoverflow.com Start-Sleep -Seconds 0 Set-Window -ProcessName firefox -x 194 -y 18 -Width 1180 -Height 715 -Passthru 

С Set-Window.ps1:

Function Set-Window { <# .SYNOPSIS Sets the window size (height,width) and coordinates (x,y) of a process window.  .DESCRIPTION Sets the window size (height,width) and coordinates (x,y) of a process window.  .PARAMETER ProcessName Name of the process to determine the window characteristics  .PARAMETER X Set the position of the window in pixels from the top.  .PARAMETER Y Set the position of the window in pixels from the left.  .PARAMETER Width Set the width of the window.  .PARAMETER Height Set the height of the window.  .PARAMETER Passthru Display the output object of the window.  .NOTES Name: Set-Window Author: Boe Prox Version History 1.0//Boe Prox - 11/24/2015 - Initial build 1.1//JosefZ (https://superuser.com/users/376602/josefz) - 19.05.2018 - treats more process instances of supplied process name properly  .OUTPUT System.Automation.WindowInfo  .EXAMPLE Get-Process powershell | Set-Window -X 2040 -Y 142 -Passthru  ProcessName Size TopLeft BottomRight ----------- ---- ------- ----------- powershell 1262,642 2040,142 3302,784   Description ----------- Set the coordinates on the window for the process PowerShell.exe  #> [OutputType('System.Automation.WindowInfo')] [cmdletbinding()] Param ( [parameter(ValueFromPipelineByPropertyName=$True)] $ProcessName, [int]$X, [int]$Y, [int]$Width, [int]$Height, [switch]$Passthru ) Begin { Try{ [void][Window] } Catch { Add-Type @" using System; using System.Runtime.InteropServices; public class Window { [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect);  [DllImport("User32.dll")] public extern static bool MoveWindow(IntPtr handle, int x, int y, int width, int height, bool redraw); } public struct RECT { public int Left; // x position of upper-left corner public int Top; // y position of upper-left corner public int Right; // x position of lower-right corner public int Bottom; // y position of lower-right corner } "@ } } Process { $Rectangle = New-Object RECT $Handles = (Get-Process -Name $ProcessName).MainWindowHandle ### 1.1//JosefZ foreach ( $Handle in $Handles ) { ### 1.1//JosefZ if ( $Handle -eq [System.IntPtr]::Zero ) { Continue } ### 1.1//JosefZ $Return = [Window]::GetWindowRect($Handle,[ref]$Rectangle) If (-NOT $PSBoundParameters.ContainsKey('Width')) {  $Width = $Rectangle.Right - $Rectangle.Left  } If (-NOT $PSBoundParameters.ContainsKey('Height')) { $Height = $Rectangle.Bottom - $Rectangle.Top } If ($Return) { $Return = [Window]::MoveWindow($Handle, $x, $y, $Width, $Height,$True) } If ($PSBoundParameters.ContainsKey('Passthru')) { $Rectangle = New-Object RECT $Return = [Window]::GetWindowRect($Handle,[ref]$Rectangle) If ($Return) { $Height = $Rectangle.Bottom - $Rectangle.Top $Width = $Rectangle.Right - $Rectangle.Left $Size = New-Object System.Management.Automation.Host.Size -ArgumentList $Width, $Height $TopLeft = New-Object System.Management.Automation.Host.Coordinates -ArgumentList $Rectangle.Left, $Rectangle.Top $BottomRight = New-Object System.Management.Automation.Host.Coordinates -ArgumentList $Rectangle.Right, $Rectangle.Bottom If ($Rectangle.Top -lt 0 -AND $Rectangle.LEft -lt 0) { Write-Warning "Window is minimized! Coordinates will not be accurate." } $Object = [pscustomobject]@{ ProcessName = $ProcessName Size = $Size TopLeft = $TopLeft BottomRight = $BottomRight } $Object.PSTypeNames.insert(0,'System.Automation.WindowInfo') $Object  } } } } } 

Все это для открытия Firefox в определенной позиции на экране. Но я также хочу, чтобы он открывался поверх всех других окон, которые у меня есть в момент исполнения.

Что я могу добавить к сценариям, чтобы сделать эту работу?

0
Это происходит по умолчанию, потому что запуск нового процесса, особенно .exe, всегда является активным окном. Если это не происходит для вас, то это звучит очень странно. Какова ваша цель / сценарий использования для такого рода вещей, поскольку вы говорите, что находитесь в интерактивном сеансе с полным рабочим столом, а не просто запускаете FF напрямую? postanote 5 лет назад 0

0 ответов на вопрос