winforms 如何确保表单是顶部窗口

6g8kf2rb  于 2023-10-23  发布在  其他
关注(0)|答案(2)|浏览(158)

我有一个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
}
busg9geu

busg9geu1#

我所知道的将表单强制设置为topmost的最简单方法是使用一个新的临时表单打开它,该临时表单的TopMost作为ShowDialog()的参数。
首先,从代码中删除$form.Topmost = $true$form.TopLevel = $true
接下来,像这样显示您的表单:

# force the dialog TopMost by creating a temporary parent window for this form
$result = $form.ShowDialog((New-Object System.Windows.Forms.Form -Property @{TopMost = $true }))

另一种方法是使用一段C#返回一个实现IWin32Window interface的windowhandle。然后在窗体的.ShowDialog()方法中使用此句柄作为此窗体的所有者窗口。
对于此方法,还需要从原始代码中删除$form.Topmost = $true$form.TopLevel = $true行。

$iWin32Code = @"
using System;
using System.Windows.Forms;

public class Win32Window : IWin32Window {
    public Win32Window(IntPtr handle) {
        Handle = handle;
    }

    public IntPtr Handle { get; private set; }
}
"@

if (-not ([System.Management.Automation.PSTypeName]'Win32Window').Type) {
    Add-Type -TypeDefinition $iWin32Code -ReferencedAssemblies System.Windows.Forms.dll 
}

现在,使用该代码为当前运行的PowerShell进程创建一个句柄

# get the owner handle from this PowerShell process
$ownerHandle = New-Object Win32Window -ArgumentList ([System.Diagnostics.Process]::GetCurrentProcess().MainWindowHandle)
# and use that in the ShowDialog method as argument
$result = $form.ShowDialog($ownerHandle)

P.S.不要忘记在你完成后通过调用从记忆中清除你的表单

$form.Dispose()
uoifb46i

uoifb46i2#

我也有同样的问题,但是,我没有直接在变量中读取$form.ShowDialog()的结果,而是使用了由表单控件更新的变量。
在ShowDialog()之后移动这一行为我解决了这个问题:

[void] $Form.ShowDialog() 
$form.TopMost = $true

现在表格显示在前面。

相关问题