2008-10-19 2 views
6

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

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

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

+0

Если кто-то заинтересован, это то, что я использовал его для: http://stackoverflow.com/questions/182573/powershell-cli-or-gui-which-do-you- нуждаются или предпочитают # 216936 – 2008-10-19 20:42:00

ответ

17

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

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

Пример:

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

Good Luck!

+0

Интересное обходное решение! Было бы интересно узнать, как настройка ShowHelp «исправляет» проблему, но я рад, что она работает :) – 2008-10-19 18:51:15

+0

Странно, обходной путь для меня не работает. С ним или без него диалог открывается за окном powershell. – Charlie 2008-10-19 18:52:22

2

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

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

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

Смотрите также: Could you explain STA and MTA?

Смежные вопросы