具有自动刷新功能的带有Web浏览器的PowerShell表单

时间:2019-01-07 18:47:42

标签: wpf powershell xaml refresh webbrowser-control

我试图在PowerShell中的一个小窗口中创建一个简单的窗体,该窗体始终位于其他窗口的顶部,并且只包含一个Web浏览器对象,该对象每10秒自动刷新一次。我一直在网上搜索并尝试各种选择,但似乎没有任何效果。我遇到的每个示例几乎都在按下按钮时刷新表单或Web浏览器,但是我需要Web浏览器自行自动刷新,而无需任何用户交互。根据我的阅读,听起来好像是带有XAML(可扩展应用程序标记语言)的WPF(Windows Presentation Foundation),因为WinForms被限制在一个线程中,这使得刷新表单变得更加困难甚至是不可能。有效完成。

目前,这是我所拥有的(使用google测试),没有自动刷新:

[void][System.Reflection.Assembly]::LoadWithPartialName('presentationframework')
[xml]$XAML = @'
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="PowerShell HTML GUI" WindowStartupLocation="Manual">
    <Grid>
        <WebBrowser
            HorizontalAlignment="Left"
            Width="415"
            Height="340"
            Margin="10,10,0,0"
            VerticalAlignment="Top"
            Name="WebBrowser"
        />
    </Grid>
</Window>
'@
$reader = New-Object System.Xml.XmlNodeReader($xaml)
$Form = [Windows.Markup.XamlReader]::Load($reader)
$Form.Width = 415
$Form.Height = 340
$Form.Topmost = $True
$WebBrowser = $Form.FindName('WebBrowser')
$WebBrowser.add_Loaded({$this.Navigate('http://www.google.com')})
$Form.ShowDialog()

我尝试在代码末尾添加以下循环以替换$Form.ShowDialog(),但显然这行不通。

While (1) {
    Start-Sleep -seconds 10
    $WebBrowser.Refresh()
    $Form.ShowDialog()
}

我认为我需要使用System.Windows.Forms.Timer类,但是我不确定如何在没有任何用户交互的情况下将其实现到本示例中。

有人知道吗?

2 个答案:

答案 0 :(得分:0)

是的,您将必须使用计时器。

有关更多详细信息,请参见本文中的示例。不,它不是直接与Web控件对话,但是相同的方法可以使您到达那里。

Weekend Scripter: Create a Holiday Greeting Using PowerShell and WPF

  

最后一段有趣的代码是我们如何更新内容   WPF对象的状态。脚本使用此功能来显示   直到新年的天数,小时数,分钟数和秒数。去做   为此,我们创建了一个$ countDownUpdate脚本块,其中包含一个   New-Timespan cmdlet。这将计算now和   在2010年12月31日午夜,然后在内容上设置此值   标签控件的属性。

# scriptblock that gets called every second by the timer object
# updates the 'content' property of the countdownlabel
$countDownUpdate = {
    $ts = New-TimeSpan -Start $([datetime]::now) -End $([datetime]"12/31/2010 00:00:00")

    # find the countdown label control
    $lbl = $objCanvas.FindName("countDown")
    $lbl.content = "$($ts.Days) . $($ts.Hours) : $($ts.Minutes) : $($ts.Seconds)"
}

另请参见以下示例:

A PowerShell clock

  

我最终使用Windows Presentation Foundation

## Create a script block which will update the UI            
 $counter = 0;            
 $updateBlock = {            
    # Update the clock            
    $clock.Resources["Time"] = [DateTime]::Now.ToString("T")            
 }            

## Hook up some event handlers             
$clock.Add_SourceInitialized( {            
    ## Before the window's even displayed ...            
    ## We'll create a timer            
    $timer = new-object System.Windows.Threading.DispatcherTimer            
    ## Which will fire 4 times every second            
    $timer.Interval = [TimeSpan]"0:0:0.25"            
    ## And will invoke the $updateBlock            
    $timer.Add_Tick( $updateBlock )            
    ## Now start the timer running            
    $timer.Start()            
    if( $timer.IsEnabled ) {            
       Write-Host "Clock is running. Don't forget: RIGHT-CLICK to close it."            
    } else {            
       $clock.Close()            
       Write-Error "Timer didn't start"            
    }            
 } ) 

答案 1 :(得分:0)

我在Reddit的某个用户处获得了帮助,因为此处提供的当前答案(尤其是答案的第一部分)只会让我更加困惑。