Я пытаюсь создать простую форму в PowerShell в небольшом окне, которое всегда находится поверх других окон и просто содержит объект веб-браузера, который автоматически обновляется каждые 10 секунд. Я искал в Интернете и пробовал разные варианты, но ничего не помогло. Почти в каждом примере, с которым я сталкиваюсь, обновление формы или веб-браузера происходит при нажатии кнопки, но мне нужно, чтобы веб-браузер автоматически обновлялся без какого-либо вмешательства пользователя. Из того, что я читал, звучит как WPF (Windows Presentation Foundation) с XAML (расширяемый язык разметки приложений), так как 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
, но я не уверен, как реализовать это в этом примере без какого-либо взаимодействия с пользователем.
Кто-нибудь может понять это?