вызвать OpenFileDialog из powershell - PullRequest
6 голосов
/ 19 октября 2008

Когда я запускаю следующее, PowerShell зависает, ожидая закрытия диалогового окна, даже если оно никогда не отображается:

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

Вызов ShowDialog на Windows.Forms.Form работает нормально. Я также попытался создать Form и передать его в качестве родителя $d.ShowDialog, но результат не изменился.

Ответы [ 3 ]

17 голосов
/ 19 октября 2008

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

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

Пример:

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

Удачи!

2 голосов
/ 19 октября 2008

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

РЕДАКТИРОВАТЬ Вот способ сделать это, используя вашу идею вторичной формы. Основная идея заключается в создании новой формы, которая открывает OpenFileDialog из его события Shown. Клавиша вызывает Активировать на форме перед открытием диалога, так что форма выходит вперед и диалоговое окно появляется. Я переместил форму за пределы экрана, установив для Location значение вне экрана, но вы можете альтернативно установить Form.Visible = $ false из события Shown.

[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()
1 голос
/ 27 июня 2014

Очевидно, это как-то связано с режимом многопоточных квартир (MTA). Похоже, что он работает нормально в режиме однопотоковой квартиры (-STA).

См. Также: Не могли бы вы объяснить STA и MTA?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...