title: opening internet explorer with specific size and position on screen
body: <p>I want to open Internet Explorer with an especific size and in a specific position on screen.</p>
  
  <p>I have found two ways of doing this:</p>
  
  <p>The problem I have with the first is that, it does everything okay but it start to lag, making it impossible to use and I have to kill the program. I don't know why, because I use the same code to open Firefox and it works fine:</p>
  
  <pre><code>. C:\Users\user\git\testPowerShell/Set-Window.ps1
  Start-Process -FilePath 'C:/Program Files/internet explorer/iexplore.exe' -ArgumentList https://www.facebook.com/
  Start-Sleep -Seconds 0
  Set-Window -ProcessName iexplore -x 100 -y 5 -Width 1176 -Height 715 -Passthru
  </code></pre>
  
  <p>The problem with second is that the windows that opens doesn't have focus, I really need that Internet Explorer opens on top of everything:</p>
  
  <pre><code>$ie = new-object -comobject InternetExplorer.Application;
  $ie.visible = $true;
  #$ie2 = $ie.Width = 200;
  $ie.top = 15; $ie.width = 1180; $ie.height = 710; $ie.Left = 192;
  $ie.navigate('https://www.facebook.com/');
  </code></pre>
  
  <p>Any solution to either approach?</p>
  
  <hr>
  
  <p>Also, Set-Windows.ps1 is like this</p>
  
  <pre><code>Function Set-Window {
      &lt;#
          .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
  
      #&gt;
      [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            
                  }
              }
          }
      }
  }
  </code></pre>