# encoding: ascii
# api: powershell
# title: UIAutomation Simple 2
# description: More fun with S.W.A. @kryten68 – Added Transforms and examples
# version: 0.1
# type: function
# author: Joel Bennett
# license: CC0
# function: Select-Window
# x-poshcode-id: 1231
# x-archived: 2012-12-28T07:46:48
# x-published: 2009-07-24T14:44:00
#
#
[Reflection.Assembly]::Load("UIAutomationClient, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")
[Reflection.Assembly]::Load("UIAutomationTypes, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")

function Select-Window {
PARAM( [string]$Text="*", [switch]$Recurse,
       [System.Windows.Automation.AutomationElement]$Parent = [System.Windows.Automation.AutomationElement]::RootElement ) 
PROCESS {
   if($Recurse) {
      $Parent.FindAll( "Descendants", [System.Windows.Automation.Condition]::TrueCondition ) | 
      Where-Object { $_.GetCurrentPropertyValue([System.Windows.Automation.AutomationElementIdentifiers]::NameProperty)  -like $Text } |
      Add-Member -Name Window -Type ScriptProperty -Value {$this.GetCurrentPattern( [System.Windows.Automation.WindowPattern]::Pattern )} -Passthru |
      Add-Member -Name Transform -Type ScriptProperty -Value {$this.GetCurrentPattern( [System.Windows.Automation.TransformPattern]::Pattern )} -Passthru 
   } else {
      $Parent.FindAll( "Children", [System.Windows.Automation.Condition]::TrueCondition ) | 
      Where-Object { $_.GetCurrentPropertyValue([System.Windows.Automation.AutomationElementIdentifiers]::NameProperty)  -like $Text }|
      Add-Member -Name Window -Type ScriptProperty -Value {$this.GetCurrentPattern( [System.Windows.Automation.WindowPattern]::Pattern )} -Passthru |
      Add-Member -Name Transform -Type ScriptProperty -Value {$this.GetCurrentPattern( [System.Windows.Automation.TransformPattern]::Pattern )} -Passthru
   }
}}

### To minimize all notepad windows
# select-window *notepad | ForEach { $_.Window.SetWindowVisualState("Minimized") }

### To Close all notepad windows
# select-window *notepad | ForEach { $_.Window.Close() }

### To resize all notepad windows, be sure to make then "Normal" first (not minimized/maximized)
#  select-window *notepad | ForEach { $_.Window.SetWindowVisualState("Normal"); $_.Transform.Resize( 400, 600) }

### To tile two notepad windows
#  Add-Type -Assembly System.Windows.Forms # so we can figure out the screen size
#  $bounds = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds
#
#  Select-window *notepad | Select -First 2 | Tee -Var Windows | 
#     ForEach { 
#         $_.Window.SetWindowVisualState("Normal")
#         $_.Transform.Resize( ($bounds.Width/2), $bounds.Height ) 
#     }
#  $windows[0].Transform.Move( ($bounds.Left), ($bounds.Top) )
#  $windows[1].Transform.Move( ($bounds.Left + $bounds.Width/2),($bounds.Top)  )
