我有一个PS脚本,实现系统。窗口。形式,以查询技术人员的一些数据。
我创建表单并将.Topmost和.TopLevel都设置为true,试图让它们显示在PowerShell窗口上,但它们继续(出于某种原因不一致)显示在PowerShell窗口后面。这减慢了这个过程,并且在其不一致性中令人困惑。
如果有人知道如何确保这些窗口停留在顶部,而没有比脚本本身更大的代码山,这将是非常有用的。我将包括我用来构建下面的基本表单之一的代码。
任何简单的解决方案,将允许这些形式出现在PowerShell窗口是赞赏。它甚至可以最小化PS窗口,但我不想在没有窗口的情况下启动,因为我们需要它打开。谢谢.
$form.Text = 'Computer Name Entry'
$form.Size = New-Object System.Drawing.Size(550,400)
$form.StartPosition = 'CenterScreen'
$okButton = New-Object System.Windows.Forms.Button
$okButton.Location = New-Object System.Drawing.Point(75,300)
$okButton.Size = New-Object System.Drawing.Size(75,23)
$okButton.Text = 'OK'
$okButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $okButton
$form.Controls.Add($okButton)
$label = New-Object System.Windows.Forms.Label
$label.Location = New-Object System.Drawing.Point(10,20)
$label.Size = New-Object System.Drawing.Size(400,40)
$label.Text = 'Text is here:'
$form.Controls.Add($label)
$textBox = New-Object System.Windows.Forms.TextBox
$textBox.Location = New-Object System.Drawing.Point(10,70)
$textBox.Size = New-Object System.Drawing.Size(400,20)
$form.Controls.Add($textBox)
$form.Topmost = $true
$form.TopLevel = $true
$form.Add_Shown({$textBox.Select()})
$result = $form.ShowDialog()
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
Do-Stuff
}
2条答案
按热度按时间busg9geu1#
我所知道的将表单强制设置为topmost的最简单方法是使用一个新的临时表单打开它,该临时表单的TopMost作为
ShowDialog()
的参数。首先,从代码中删除
$form.Topmost = $true
和$form.TopLevel = $true
行接下来,像这样显示您的表单:
另一种方法是使用一段C#返回一个实现IWin32Window interface的windowhandle。然后在窗体的
.ShowDialog()
方法中使用此句柄作为此窗体的所有者窗口。对于此方法,还需要从原始代码中删除
$form.Topmost = $true
和$form.TopLevel = $true
行。现在,使用该代码为当前运行的PowerShell进程创建一个句柄
P.S.不要忘记在你完成后通过调用从记忆中清除你的表单
uoifb46i2#
我也有同样的问题,但是,我没有直接在变量中读取$form.ShowDialog()的结果,而是使用了由表单控件更新的变量。
在ShowDialog()之后移动这一行为我解决了这个问题:
现在表格显示在前面。