6

次のコマンドを実行すると、ダイアログが表示されないにもかかわらず、ダイアログが閉じるのを待って PowerShell がハングします。

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

正常ShowDialogWindows.Forms.Form動作します。また、 を作成しFormて に親として渡してみました$d.ShowDialogが、結果は変わりませんでした。

4

3 に答える 3

16

問題を再現し、回避策を見つけることができました。なぜそうなったのかはわかりませんが、他の人にも起こっています。

ShowHelp プロパティを $true に設定すると、ダイアログが正しく表示されます。

例:

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

幸運を!

于 2008-10-19T17:57:54.387 に答える
2

ダイアログは実際には問題なく開いているように見えますが、PowerShellコンソールウィンドウの背後にあります。残念ながら、タスクバーには表示されないため、PowerShellウィンドウまたはAlt+Tabを移動しない限り表示されません。また、ShowHelpの回避策は私には何の効果もなかったようです。

編集これは、二次形式のアイデアを使用してそれを行う方法です。基本的な考え方は、Shownイベント内からOpenFileDialogを開く新しいフォームを作成することです。キーは、ダイアログを開く前にフォームでアクティブ化を呼び出すことです。これにより、フォームが前面に表示され、ダイアログが表示されます。Locationをオフスクリーン値に設定してフォームをオフスクリーンに移動しましたが、Shownイベント内から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()
于 2008-10-19T18:22:41.060 に答える
1

どうやら、これはマルチスレッド アパートメント (MTA) モードと関係があるようです。シングルスレッド アパートメント (-STA) モードでは問題なく動作するようです。

参照: STA と MTA について説明してもらえますか?

于 2014-06-27T09:30:28.633 に答える