我试图为输入框设置一个时间限制,然后关闭它。
我使用了if命令和结束日期 这样:
$endDate = (Get-Date).AddSeconds(10)
while ((Get-Date) -lt $endDate) {
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = "Data Entry Form"
$objForm.Size = New-Object System.Drawing.Size(300,200)
$objForm.StartPosition = "CenterScreen"
$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter")
{$Choice = $objTextBox.SelectedItem.ToString(); $objForm.Close()}})
$objForm.Topmost = $True
if ((Get-Date) -ge $Fate) { $objForm.Invoke( }
$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()
}
if ((Get-Date) -ge $endDate) { #whatever Function Here}
似乎输入框会停止脚本的所有操作。我试图在不使用while循环的情况下在同一函数内计算第二个函数(以if开头的函数),但它没有工作。
任何想法?
答案 0 :(得分:1)
即使输入框停止了脚本的操作,也可能无法阻止事件订阅运行。如果是这种情况,您可以使用System.Timers.Timer
类来注册超时。
如果在调用输入框之前创建以下事件注册,则可能允许您关闭输入框。
$Timer = New-Object -TypeName System.Timers.Timer;
$Timer.Interval = 30000; # Timeout in milliseconds (30 seconds)
$Action = {
Start-Sleep -Seconds 10; # Create a delay for the action
$objForm.Close(); # This line *should* close the Form object
$Timer.Enabled = $false; # Stop the timer from executing
Get-EventSubscriber -SourceIdentifier Timer | Unregister-Event; # Unregister the event handler
};
Register-ObjectEvent -InputObject $Timer -EventName Elapsed -SourceIdentifier Timer -Action $Action;
$Timer.Enabled = $true;