вызов 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?