从powershell调用OpenFileDialog

时间:2008-10-19 17:32:01

标签: winforms powershell

当我运行以下命令时,PowerShell会挂起,等待对话框关闭,即使对话框从未显示过:

[void] [Reflection.Assembly]::LoadWithPartialName( 'System.Windows.Forms' )
$d = New-Object Windows.Forms.OpenFileDialog
$d.ShowDialog( )

ShowDialog上拨打Windows.Forms.Form可以正常使用。我还尝试创建Form并将其作为父项传递给$d.ShowDialog,但结果没有区别。

3 个答案:

答案 0 :(得分:17)

我能够复制您的问题并找到了解决方法。我不知道为什么会这样,但它发生在其他人身上。

如果将ShowHelp属性设置为$ true,则会使对话框正确显示。

示例:

[void] [Reflection.Assembly]::LoadWithPartialName( 'System.Windows.Forms' )
$d = New-Object Windows.Forms.OpenFileDialog
$d.ShowHelp = $true
$d.ShowDialog( )

祝你好运!

答案 1 :(得分:2)

在我看来,对话框实际上打开很好,但它在powershell控制台窗口后面。不幸的是它没有显示在任务栏中,因此除非你移动powershell窗口或Alt + Tab,否则没有迹象表明它在那里。似乎ShowHelp解决方法对我没有任何影响。

编辑以下是使用次要形式创建的方法。基本思想是创建一个新窗体,从其Shown事件中打开OpenFileDialog。关键是在打开对话框之前在窗体上调用Activate,以便窗体显示在前面并显示对话框。我通过将“位置”设置为屏幕外值将屏幕移出屏幕,但您也可以在“已显示”事件中设置Form.Visible = $ false。

[void] [Reflection.Assembly]::LoadWithPartialName( 'System.Windows.Forms' )

$ofn = New-Object System.Windows.Forms.OpenFileDialog

$outer = New-Object System.Windows.Forms.Form
$outer.StartPosition = [Windows.Forms.FormStartPosition] "Manual"
$outer.Location = New-Object System.Drawing.Point -100, -100
$outer.Size = New-Object System.Drawing.Size 10, 10
$outer.add_Shown( { 
   $outer.Activate();
   $ofn.ShowDialog( $outer );
   $outer.Close();
 } )
$outer.ShowDialog()

答案 2 :(得分:1)

显然这与Multi-Threaded Apartment(MTA)模式有关。 它似乎在单线程单元(-STA)模式下工作正常。

另请参阅:Could you explain STA and MTA?