【问题标题】:Why does a form displayed by PowerShell sometimes not show up?为什么 PowerShell 显示的表单有时不显示?
【发布时间】:2015-04-09 03:14:42
【问题描述】:

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

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

.Visible 在 .ShowDialog() 前后设置为 False。

但是当我执行 .Show() 时,屏幕上什么也没有显示:

$form.Show()

并且 .Visible 现在设置为 True(可能是因为 .Show() 使表单正式可见。)

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

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

但是当我再次按照 .ShowDialog() 的说明进行操作时

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

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

表单的坐标没有改变。那么表单如何决定何时可见,何时不可见呢?

【问题讨论】:

标签: winforms powershell


【解决方案1】:

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

【讨论】:

  • 有用的知识,但不能回答我所有的问题。 :-(
  • 在我的机器上,第一次调用 Show()(或设置 visible = 1)会导致表单非常短暂地出现然后消失。之后,包括 ShowDialog() 在内的进一步调用根本不会导致它出现。我怀疑这是缺乏消息泵送。如果您避免调用 Show() 并设置 Visible 属性,则 ShowDialog() 效果很好。
【解决方案2】:

我的问题:当使用 ShowDialog() 作为 powershell 登录脚本的一部分时,第一个表单窗口不会显示,并且 powershell 似乎在登录时冻结。症状与原帖类似。

我找到的解决方案:不要使用 $form.showDialog(),而是使用:

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

现在对我来说效果很好,只有系列中的第一种形式需要更改。我之后在脚本中出现的所有其他表单仍然使用 showDialog。

【讨论】:

  • 这是否允许返回结果?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 2014-03-15
相关资源
最近更新 更多