.net 如何将所有者窗口传递给MessageBox.Show(在其他线程上显示)?

.net 如何将所有者窗口传递给MessageBox.Show(在其他线程上显示)?,.net,.net,我正在试图找出Messagebox(所有者窗口,…) 使用reflector,我看到ownerWindow默认为线程的ActiveWindow 所以我唯一需要ownerWindow参数的时候就是从另一个线程调用Show 但是,当我尝试此操作时,会出现一个跨线程异常 private void button1_Click( object sender, EventArgs e ) { new Thread( () => MessageBox.Show( this, "T

我正在试图找出Messagebox(所有者窗口,…)

使用reflector,我看到ownerWindow默认为线程的ActiveWindow

所以我唯一需要ownerWindow参数的时候就是从另一个线程调用Show

但是,当我尝试此操作时,会出现一个跨线程异常

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

所以这似乎是我唯一一次需要显式声明所有者窗口,我不能使用它

您必须执行BeginInvoke来封送对UI线程的调用

下面的代码是一个简单的示例。我还没有编译它,所以它可能有错误,但它可能会给你一些指针

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");
}

如果不想在线程间显式封送调用,请使用和
报告进度

了解所有者窗口和父窗口之间的区别。ActiveWindows并不总是需要拥有messagebox,我曾经开发过这样一个应用程序,ActiveWindow不一定是messagebox的所有者

另外,根据win32窗口规则,控件层次结构不能在不同的线程上创建控件,这就是为什么需要对MessageBox.Show调用进行封送处理
父窗口的线程。

测试交叉线程的是Control.Handle getter

添加以下代码可以解决问题

   public class Win32Window :IWin32Window {
        IntPtr handle;
        public Win32Window( IWin32Window window ) {
            this.handle = window.Handle;
        }

        IntPtr IWin32Window.Handle {
            get { return handle; }
        }
    }

    private void button1_Click( object sender, EventArgs e ) {
        IWin32Window window = new Win32Window( this );
        new Thread( () => MessageBox.Show( window, "Test" ) ).Start();
    }

感谢您的链接,重要的事实是taht窗口所有权不是可传递的。因此,如果您有表单、生成表单、生成MessageBox,则应将原始表单作为MessageBox的所有者传入。指向Win32窗口层次结构和样式的链接似乎不起作用。有人有更新过的链接吗?这已经有很长时间了,但这对我有帮助:这可以跨线程和跨进程工作,尽管获取窗口句柄是一个稍微不同的跨进程。