# 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) )