在powershell中计时gui输入窗口

时间:2014-03-17 19:15:31

标签: powershell user-interface time

我试图为输入框设置一个时间限制,然后关闭它。

我使用了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开头的函数),但它没有工作。

任何想法?

1 个答案:

答案 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;