<p>I am trying to figure out Messagebox( ownerWindow, ... ).</p>

<p>Using reflector I see that the ownerWindow defaults to the ActiveWindow for the thread.</p>

<p>So the only time I need the ownerWindow parameter is to call Show from another thread.  </p>

<p>However when I try this, I get a cross threading exception.</p>

<pre><code>    private void button1_Click( object sender, EventArgs e ) {
        new Thread( () =&gt; MessageBox.Show( this, "Test" ) ).Start();
    }
</code></pre>

<p>So it looks like the only time I need the explicitly state the owner window, I cann't use it!</p>

You will have to do a BeginInvoke to marshal the call to the UI thread.
The code below is a simple example how you can do it. I haven't compiled it, so there might be errors in it, but it might give you some pointers.
```
```
private delegate void ThreadExecuteDelegate(object args);

public void StartThread
{
   Thread thread = new Thread(new ParameterizedThreadStart(ThreadExecute));
   thread.Start((IWin32Window)this);
}

private void ThreadExecute(object args)
{
    if(this.InvokeRequired)
    {
        this.BeginInvoke(new ThreadExecuteDelegate(ThreadExecute), args);
        return;
    }   

    IWin32Window window = (IWin32Window)args;
    MessageBox.Show(window, "Hello world");
}
```
```