views:

199

answers:

1

When I create a form (window) in PowerShell, I can usually display the form using .ShowDialog():

$form = New-Object System.Windows.Forms.Form
$form.ShowDialog()

.Visible is set to False before and after .ShowDialog().

But when I do a .Show() nothing is displayed on the screen:

$form.Show()

And .Visible is now set to True (presumably because .Show() made the form officially visible.)

When I now try to .ShowDialog() the form again, I get the following error message:

"Form that is already visible cannot be displayed as a modal dialog box. Set the form's visible property to false before calling showDialog."

But when I follow the instructions to .ShowDialog() again

$form.Visible=0
$form.ShowDialog()

the result is that nothing is displayed on the screen and PowerShell hangs and cannot recover (ctrl-c doesn't seem to work). I assume this is because the form is being displayed modally somewhere where I cannot see it (or tab to it). But why?

The coordinates of the form haven't changed. So how does the form decide when it is physically visible and when it isn't?

+1  A: 

Avoid using Show() from PowerShell as it requires a message pump and that isn't something the PowerShell console provides on the thread that creates your form. ShowDialog() works because the OS does the message pumping during this modal call. Creating the form and calling ShowDialog() works reliably for me.

Keith Hill
Useful knowledge but doesn't answer all of my question. :-(
Andrew J. Brehm
Perhaps there is no answer.
Andrew J. Brehm
On my machine, calling Show() (or setting visible = 1) the first time causes the form to appear very briefly and then it disappears. After that,further calls including ShowDialog() do not cause it to appear at all. I suspect it is the lack of message pumping. If you avoid calling Show() and setting the Visible property, then ShowDialog() works well.
Keith Hill