2008-10-19 9 views
6

Quand je lance ce qui suit, PowerShell se bloque en attente de la boîte de dialogue pour fermer, même si la boîte de dialogue est jamais affichée:OpenFileDialog d'appel de Powershell

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

Appel ShowDialog sur un Windows.Forms.Form fonctionne très bien. J'ai également essayé de créer un Form et de le passer en tant que parent à $d.ShowDialog, mais le résultat n'était pas différent.

+0

Si quelqu'un est intéressé, ce que je l'ai utilisé pour: http://stackoverflow.com/questions/182573/powershell-cli-or-gui-which-do-you- besoin-ou-préfèrent # 216936 –

Répondre

17

J'ai été en mesure de dupliquer votre problème et j'ai trouvé une solution de contournement. Je ne sais pas pourquoi cela arrive, mais c'est arrivé à d'autres.

Si vous définissez la propriété ShowHelp sur $ true, la boîte de dialogue s'affichera correctement.

Exemple:

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

Bonne chance!

+0

Solution de contournement intéressante! Serait intéressant de savoir comment réglage ShowHelp "corrige" le problème, mais je suis content que cela fonctionne :) –

+0

Étrange, la solution de contournement ne fonctionne pas pour moi. Avec ou sans, la boîte de dialogue s'ouvre derrière la fenêtre PowerShell. – Charlie

+0

On dirait que la différence pourrait être due à la version Powershell ou la version du système d'exploitation (voir les commentaires de Steven sur ma réponse) – Charlie

2

Il me semble que la boîte de dialogue s'ouvre correctement, mais c'est derrière la fenêtre de la console PowerShell. Malheureusement, il n'apparaît pas dans la barre des tâches, donc il n'y a aucune indication qu'il est là sauf si vous déplacez la fenêtre PowerShell ou Alt + Tab. Il apparaît également que la solution de contournement ShowHelp n'a eu aucun effet pour moi.

EDIT Voici une façon de le faire en utilisant votre idée de forme secondaire. L'idée de base est de créer un nouveau formulaire qui ouvre OpenFileDialog à l'intérieur de son événement affiché. La touche appelle Activate sur le formulaire avant d'ouvrir la boîte de dialogue, de sorte que le formulaire apparaisse au premier plan et que la boîte de dialogue s'affiche. J'ai déplacé le formulaire hors écran en définissant l'emplacement sur une valeur hors écran, mais vous pouvez également définir Form.Visible = $ false à partir de l'événement affiché.

[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

J'ai revérifié et la boîte de dialogue n'apparaît pas à tout ce que je peux dire, même après avoir déplacé ou réduit la fenêtre powershell. Doit être quelque chose de différent dans votre configuration? –

+0

J'ai essayé votre code édité; le formulaire est apparu mais la boîte de dialogue n'a fonctionné qu'après que je l'ai refait avec $ ofn.ShowHelp réglé sur true. –

+0

Je me demande si OS pourrait avoir quelque chose à voir avec ça. J'utilise XP Pro - et vous deux? – Charlie

1

Apparemment, cela a quelque chose à voir avec le mode Appartement multithread (MTA). Il semble fonctionner correctement en mode Single-Threaded Apartment (-STA).

Voir aussi: Could you explain STA and MTA?

Questions connexes