вызов OpenFileDialog из 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 ответов


я смог дублировать вашу проблему и нашел обходной путь. Я не знаю, почему это происходит, но это случалось и с другими.

Если вы установите для свойства ShowHelp значение $true, диалоговое окно появится правильно.

пример:

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

Удачи!


Мне кажется, что диалог на самом деле открывается просто отлично, но он находится за окном консоли powershell. К сожалению, он не отображается на панели задач, поэтому нет никаких указаний на то, что он есть, если вы не переместите окно powershell или вкладку Alt+. Также кажется, что обходной путь ShowHelp не имел никакого эффекта для меня.

редактировать вот способ сделать это, используя вашу идею вторичной формы. Основная идея заключается в создании новой формы, которая открывает OpenFileDialog изнутри его показанное событие. Клавиша вызывает Activate на форме перед открытием диалога, так что форма выходит на передний план и появляется диалоговое окно. Я переместил форму за пределы экрана, установив местоположение в значение за пределами экрана, но вы можете также установить форму.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()

по-видимому, это имеет какое-то отношение к многопоточному режиму квартиры (MTA). Кажется, что он отлично работает в однопоточном режиме квартиры (- STA).

Читайте также: не могли бы вы объяснить STA и MTA?