为什么PowerShell显示的表单有时不显示?

时间:2010-02-03 14:23:49

标签: winforms powershell

当我在PowerShell中创建表单(窗口)时,我通常可以使用.ShowDialog()显示表单:

$form = New-Object System.Windows.Forms.Form
$form.ShowDialog()

.Visible在.ShowDialog()。

之前和之后设置为False

但当我做.Show()屏幕上没有显示任何内容时:

$form.Show()

而.Visible现在设置为True(大概是因为.Show()使形式正式显示。)

当我现在再次尝试.ShowDialog()表单时,我收到以下错误消息:

“已经可见的表单不能显示为模式对话框。在调用showDialog之前,将表单的visible属性设置为false。”

但是当我按照指示再次使用.ShowDialog()

$form.Visible=0
$form.ShowDialog()

结果是屏幕上没有显示任何内容而PowerShell挂起且无法恢复(ctrl-c似乎不起作用)。我认为这是因为表单在某个地方显示模式,我无法看到它(或Tab键到它)。但为什么呢?

表单的坐标没有改变。那么表单如何确定它何时在物理上可见?何时不是?

2 个答案:

答案 0 :(得分:6)

避免使用PowerShell中的Show(),因为它需要一个消息泵,这不是PowerShell控制台在创建表单的线程上提供的。 ShowDialog()有效,因为操作系统在此模态调用期间执行消息处理。创建表单并调用ShowDialog()对我来说是可靠的。

答案 1 :(得分:2)

我的问题:当使用ShowDialog()作为PowerShell登录脚本的一部分时,第一个表单窗口将不显示,而PowerShell似乎在登录时冻结。症状与原始帖子相似。

我发现的解决方案:使用:

而不是使用$ form.showDialog()

[System.Windows.Forms.Application]::Run($form)

现在对我很有用,只有系列中的第一个表格需要更改。之后在脚本中出现的所有其他表单仍然使用showDialog。