You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:20:56