# encoding: ascii # api: powershell # title: UIAutomation # description: This is just a preview of what you can do with System.Windows.UIAutomation — Really you’re going to want to use the WASP module for stuff like this. # version: 0.1 # type: module # license: CC0 # function: New-UIAElement # x-poshcode-id: 922 # x-archived: 2009-03-11T04:23:36 # # # # # Select-Window Notepad | Remove-Window -passthru # # ## And later ... # # Select-Window Notepad | Select-ChildWindow | Send-Keys "%N" # # ## OR ## # # Select-Window Notepad | Select-ChildWindow | # # Select-Control -title "Do&n't Save" -recurse | Send-Click # # # # # # PS notepad | Select-Window | Select-ChildWindow | %{ New-Object Huddled.Wasp.Window $_ } # # # # cp C:\Users\Joel\Projects\PowerShell\Wasp\trunk\WASP\bin\Debug\Wasp.dll .\Modules\WASP\ # # Import-Module WASP # function formatter { END { # $input | Format-Table @{l="Text";e={$_.Text.SubString(0,25)}}, ClassName, FrameworkId -Auto # }} Add-Type -AssemblyName UIAutomationClient Add-Type -AssemblyName UIAutomationTypes $SWA = "System.Windows.Automation" Import-Module Accelerators Add-Accelerator AutoElement "$SWA.AutomationElement" -EA SilentlyContinue Add-Accelerator InvokePattern "$SWA.InvokePattern" -EA SilentlyContinue Add-Accelerator ValuePattern "$SWA.ValuePattern" -EA SilentlyContinue Add-Accelerator TextPattern "$SWA.TextPattern" -EA SilentlyContinue Add-Accelerator Condition "$SWA.Condition" -EA SilentlyContinue Add-Accelerator AndCondition "$SWA.TextPattern" -EA SilentlyContinue Add-Accelerator OrCondition "$SWA.TextPattern" -EA SilentlyContinue Add-Accelerator NotCondition "$SWA.TextPattern" -EA SilentlyContinue Add-Accelerator PropertyCondition "$SWA.PropertyCondition" -EA SilentlyContinue Add-Accelerator AutoElementIds "$SWA.AutomationElementIdentifiers" -EA SilentlyContinue Add-Accelerator TransformIds "$SWA.TransformPatternIdentifiers" -EA SilentlyContinue $FalseCondition = [Condition]::FalseCondition $TrueCondition = [Condition]::TrueCondition Add-Type -AssemblyName System.Windows.Forms Add-Accelerator SendKeys System.Windows.Forms.SendKeys -EA SilentlyContinue function New-UIAElement { [CmdletBinding()] PARAM( [Parameter(ValueFromPipeline=$true)] [AutoElement]$Element ) PROCESS { $Element | Add-Member -Name Text -Type ScriptProperty -PassThru -Value { $this.GetCurrentPropertyValue([AutoElementIds]::NameProperty) } | Add-Member -Name ClassName -Type ScriptProperty -Passthru -Value { $this.GetCurrentPropertyValue([AutoElementIds]::ClassNameProperty) } | Add-Member -Name FrameworkId -Type ScriptProperty -Passthru -Value { $this.GetCurrentPropertyValue([AutoElementIds]::FrameworkIdProperty) } | Add-Member -Name ProcessId -Type ScriptProperty -Passthru -Value { $this.GetCurrentPropertyValue([AutoElementIds]::ProcessIdProperty) } | Add-Member -Name ControlTypeL18D -Type ScriptProperty -Passthru -Value { $this.GetCurrentPropertyValue([AutoElementIds]::LocalizedControlTypeProperty) } } } function Select-Window { [CmdletBinding()] PARAM( [Parameter()] [Alias("Name")] [string]$Text="*" , [Parameter()] [string]$ClassName="*" , [Parameter(ValueFromPipeline=$true)] [AutoElement]$Parent = [AutoElement]::RootElement ) PROCESS { $Parent.FindAll( "Children", $TrueCondition ) | New-UIAElement | Where-Object { ($_.ClassName -like $ClassName) -AND ($_.Text -like $Text) } } } function formatter { END { $input | Format-Table @{l="Text";e={$_.Text.SubString(0,25)}}, ClassName, FrameworkId -Auto }} function Invoke-Element { [CmdletBinding()] PARAM( [Parameter(ValueFromPipeline=$true)] [AutoElement]$Target ) PROCESS { $Target.GetCurrentPattern([InvokePattern]::Pattern).Invoke() } } function Set-ElementText { [CmdletBinding()] PARAM( [Parameter()] [string]$Text , [Parameter(ValueFromPipeline=$true)] [AutoElement]$Target ) PROCESS { $Target.SetFocus(); $textPattern = $valuePattern = $null try { $textPattern = $Target.GetCurrentPattern([TextPattern]::Pattern) Write-Host "textPattern:`n$($textPattern | gm)" } catch { } try { $valuePattern = $Target.GetCurrentPattern([ValuePattern]::Pattern) Write-Host "valuePattern:`n$($valuePattern | gm)" } catch { } $Target.SetFocus(); if($valuePattern) { $valuePattern.SetValue( $Text ) } if($textPattern) { [SendKeys]::SendWait("^{HOME}"); [SendKeys]::SendWait("^+{END}"); [SendKeys]::SendWait("{DEL}"); [SendKeys]::SendWait( $Text ) } } }