Public/Set-AlwaysOnTop.ps1

$signature = @"
     
    [DllImport("user32.dll")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
    public static IntPtr FindWindow(string windowName){
        return FindWindow(null,windowName);
    }
 
    [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 ShowWindow(IntPtr hWnd, int nCmdShow);
 
    static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
    static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
 
    const UInt32 SWP_NOSIZE = 0x0001;
    const UInt32 SWP_NOMOVE = 0x0002;
 
    const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;
 
    public static void MakeTopMost (IntPtr fHandle)
    {
        SetWindowPos(fHandle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
    }
 
    public static void MakeNormal (IntPtr fHandle)
    {
        SetWindowPos(fHandle, HWND_NOTOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
    }
"@


function Set-AlwaysOnTop {
  [CmdletBinding()]
  param(
    [Parameter(
      # Mandatory = $true,
      ValueFromPipeline = $true,
      ValueFromPipelineByPropertyName = $true,
      Position = 0
      # ParameterSetName = "ByHandle"
    )]
    [int]$MainWindowHandle,
    [Parameter(
      # Mandatory = $true,
      ValueFromPipeline = $true,
      ValueFromPipelineByPropertyName = $true,
      Position = 1
      # ParameterSetName = "ByTitle"
    )]
    [string]$MainWindowTitle,
    [Parameter()][switch]$Reset
  )

  if ($MainWindowHandle -eq 0) {

    if ([string]::IsNullOrEmpty($MainWindowTitle)) {

      $windowTitles = Get-Process | where-object { $_.MainWindowTitle  -ne ""} | Select-Object -ExpandProperty MainWindowTitle;

      $MainWindowTitle = Get-Selection $windowTitles -Required
      # throw "Neither MainWindowHandle nor MainWindowTitle specified"
    }

    $process = Get-ProcessByTitle $MainWindowTitle

    if ($process.MainWindowHandle -eq 0) {
      throw "Could not find window with title '$MainWindowTitle'"
    }

  }

  $app = Add-Type -MemberDefinition $signature -Name Win32Window -Namespace de.dotup -ReferencedAssemblies System.Windows.Forms -Using System.Windows.Forms -PassThru

  if ($Reset) {
    Write-Debug "Set window $process.MainWindowHandle to NORMAL state"
    $app::MakeNormal($process.MainWindowHandle)
  }
  else {
    Write-Debug "Set window $process.MainWindowHandle to TOPMOST state"
    $app::MakeTopMost($process.MainWindowHandle)
  }
        
}


# $openApplications = getOpenApplications
# $chosenApplication = createDropdownBox($openApplications)
# forceApplicationOnTop($chosenApplication)
# $title = Get-WindowByTitle *power* | Select-Object -First 1 | Select-Object MainWindowHandle, MainWindowTitle #| Out-String
# $x = $title | Select-Object -ExpandProperty MainWindowHandle
# $y = $title | Select-Object -ExpandProperty MainWindowTitle
# Write-Host $x
#Set-AlwaysOnTop #-MainWindowHandle $x -MainWindowTitle $y -Disable