如何使用FlaUI在Paint的「另存为」对话框中设置字段值?
解决FlaUI操作Paint「另存为」对话框输入框的问题
错误原因
你遇到的SetValue方法不存在的问题,是因为FindAllDescendants返回的是通用的AutomationElement对象,而SetValue是TextBox类控件特有的方法,必须先将通用元素转换为TextBox类型才能调用。
修正步骤与代码
- 精确定位「另存为」对话框:原代码定位的是Paint主窗口,需要改为定位「另存为」对话框窗口
- 转换为TextBox控件:找到目标元素后,调用
AsTextBox()方法转换为TextBox对象,再执行输入操作 - 增加空值检查:避免因未找到控件导致的报错
修正后的PowerShell代码:
Add-Type -Path C:\Users\sergi\assemblies\bin\Release\net48\publish\FlaUI.UIA3.dll # 定位另存为对话框(根据系统语言调整标题,中文系统用「另存为」,英文用「Save As」) $saveDialogTitle = '另存为' $controlName = 'Name:' $automation = [FlaUI.UIA3.UIA3Automation]::new() $process = Get-Process | Where-Object {$_.MainWindowTitle -match 'Untitled - Paint'} $app = [FlaUI.Core.Application]::Attach($process) # 遍历所有顶级窗口,找到另存为对话框 foreach ($wnd in $app.GetAllTopLevelWindows($automation)) { if ($wnd.Title -match $saveDialogTitle) { # 找到Name:对应的输入控件,转为TextBox $inputElement = $wnd.FindAllDescendants() | Where-Object {$_.Name -eq $controlName} if ($inputElement -and $inputElement.Count -gt 0) { $textBox = $inputElement[0].AsTextBox() # 两种输入方式可选:SetValue或Enter文本 $textBox.SetValue('Value Test') # 或者用Enter方法模拟键盘输入:$textBox.Enter('Value Test') } break # 找到对话框后退出循环 } } # 清理资源 $automation.Dispose()
额外说明
- 如果是英文系统,将
$saveDialogTitle改为'Save As' - 除了
SetValue,也可以用Enter方法模拟实际键盘输入,适合某些特殊控件场景 - 始终记得在操作完成后调用
Dispose()释放自动化资源,避免内存泄漏
内容的提问来源于stack exchange,提问作者sysOut
相关产品推荐
相关产品推荐

