PowerShell中ShowUI详细帮助获取及窗口控制问题咨询
ShowUI New-Window 添加关闭按钮与自动关闭解决方案
我找不到ShowUI函数的清晰使用说明,自己写了个电影搜索函数用来更新影片清单,能正常运行并把内容加到New-Window里,但想加关闭按钮或者设置自动关闭时长。试自动关闭时遇到窗口独占焦点直到关闭的问题,代码如下:
function movie($sss,$ii){ cls $a = ((wget "https://www.allmovie.com/search/all/$sss" ).allelements|where tagname -match "LI"|where class -match 'movie')|select * $a = ($a.innertext -join(";" ) -isplit('movie') -split(';')) if($ii -lt ''){ $a = $a[4] -replace('\s\s') }else{ $a -replace(".?img|DB|@.*|_images*|.com).*|\s\s|(""\W)", "")|out-host BREAK } $moviesearch = new-window $B -TaskbarItemInfo "Movie Search" -Background black -Foreground red -width 500 -Height 300 -top 100 -left 100 -FontSize 16 -show|out-null }
解决方法
1. 添加关闭按钮
直接在New-Window的脚本块里嵌入按钮控件,绑定点击事件实现手动关闭:
$moviesearch = New-Window -TaskbarItemInfo "Movie Search" -Background black -Foreground red -Width 500 -Height 300 -Top 100 -Left 100 -FontSize 16 { # 展示电影内容 Add-TextBlock -Text $a -Foreground Red -Background Black -FontSize 16 -Margin 10 # 添加关闭按钮,固定在窗口底部右侧 Add-Button -Content "关闭" -HorizontalAlignment Right -VerticalAlignment Bottom -Margin 10 -On_Click { $this.Window.Close() } } -Show | Out-Null
2. 实现非阻塞自动关闭
用WPF的DispatcherTimer实现后台定时关闭,避免窗口独占焦点:
$moviesearch = New-Window -TaskbarItemInfo "Movie Search" -Background black -Foreground red -Width 500 -Height 300 -Top 100 -Left 100 -FontSize 16 { Add-TextBlock -Text $a -Foreground Red -Background Black -FontSize 16 -Margin 10 } -Show | Out-Null # 设置5秒后自动关闭(单位毫秒,可自行调整) $autoCloseTimer = New-Object System.Windows.Threading.DispatcherTimer $autoCloseTimer.Interval = [TimeSpan]::FromSeconds(5) $autoCloseTimer.Add_Tick({ if ($moviesearch.IsVisible) { $moviesearch.Close() $autoCloseTimer.Stop() } }) $autoCloseTimer.Start()
合并需求(手动关闭+自动关闭)
把两种逻辑整合,窗口支持手动点击关闭,也会在指定时间后自动关闭:
function movie($sss,$ii){ cls $a = ((wget "https://www.allmovie.com/search/all/$sss" ).allelements|where tagname -match "LI"|where class -match 'movie')|select * $a = ($a.innertext -join(";" ) -isplit('movie') -split(';')) if($ii -lt ''){ $a = $a[4] -replace('\s\s+', ' ') # 优化多空格替换逻辑 }else{ $a -replace(".?img|DB|@.*|_images*|.com).*|\s\s+|(""\W)", "")|out-host BREAK } $moviesearch = New-Window -TaskbarItemInfo "Movie Search" -Background black -Foreground red -Width 500 -Height 300 -Top 100 -Left 100 -FontSize 16 { Add-TextBlock -Text $a -Foreground Red -Background Black -FontSize 16 -Margin 10 Add-Button -Content "关闭" -HorizontalAlignment Right -VerticalAlignment Bottom -Margin 10 -On_Click { $this.Window.Close() } } -Show | Out-Null # 设置5秒自动关闭 $autoCloseTimer = New-Object System.Windows.Threading.DispatcherTimer $autoCloseTimer.Interval = [TimeSpan]::FromSeconds(5) $autoCloseTimer.Add_Tick({ if ($moviesearch.IsVisible) { $moviesearch.Close() $autoCloseTimer.Stop() } }) $autoCloseTimer.Start() }
关键说明
- 使用New-Window的脚本块参数可以直接嵌入UI控件,比单独创建窗口后再添加更简洁。
DispatcherTimer是WPF原生定时器,运行在后台线程,不会阻塞主线程导致窗口独占焦点。- 替换多空格时用
\s\s+能更精准匹配连续空格,避免替换不彻底。
内容的提问来源于stack exchange,提问作者J. Breneman
相关产品推荐
相关产品推荐

