2010-05-08 63 views
0

我通过将Show方法传递给另一个进程中创建的窗体的句柄,从一个进程显示新窗体。我只希望这个新窗体显示在传递的窗体之上,就像一个MessageBox。不希望窗体显示在其他应用程序窗口上

然而,这个新推出的形式出现上述其他应用程序窗口,尽管:

  • 设置Process.WindowStyle.Hidden到表单显示处理
  • 覆盖表单的ShowWithoutActivation和性能的CreateParams。
  • 确保Form.TopMost

我已经检查了窗口句柄是从第二个进程有效是不正确的。 但是,重点不会被盗。

Process A: 
Pass (Form) window handle to a new Process B via the command line 

Process B: 
Display a new Form using Form.Show(anotherProcessWindowHandle) 

回答

1

您正在与SetForegroundWindow()的规则作斗争。请注意备注部分中的“它不起作用”的长列表。 AllowSetForegroundWindow()是解决方案。


为了确保窗口总是重叠另一个窗口,与所述展()或ShowDialog的()重写,是以所有者参数显示它。例如:

using (var dlg = new MyMessageBoxForm(ex.Message)) { 
    dlg.ShowDialog(this); 
} 

拥有的窗口始终显示在其所有者的顶部,并得到其所有者一起最小化和关闭。


制作窗口的另一个进程窗口的所有者是Windows SDK明确禁止的。 Windows窗体不会让你这样做。然而,Windows版本3应用程序有一个appcompat模式。那时,这样做没有问题,它不支持线程。在你的窗口上调用SetParent()并从另一个进程传递窗口的窗口句柄。它打破了保修,但往往运作良好。

+0

虽然我想要SetForegroundWindow的相反行为。你能详细说明吗? – 2010-05-13 22:36:50

+0

不计算。你希望它在后台,总是被其他窗口覆盖? – 2010-05-13 23:02:18

+0

我希望这个新窗体表现为传递给第二个进程的窗口(句柄)的MessageBox。如果第一个进程/窗口位于前台,那么MessageBox应该出现在窗口上,但是如果窗口不可见或者MessageBox出现的区域被遮挡,那么MessageBox就不应该显示。 – 2010-05-14 07:14:30

相关问题