如何将.NET表单始终保持在另一个应用程序之上?

时间:2012-04-25 07:48:13

标签: c# .net winforms layout window

我有一个作为主应用程序运行的C ++应用程序。 .NET应用程序也是并行运行的,我通过套接字进行进程间通信。如何在.NET应用程序上面维护.NET主窗体?

方法:

  • 目前我设置了TopMost = true,但是当您打开另一个应用程序时会出现问题:.NET应用程序出现在所有其他应用程序之上。

  • 另一种方法是检查你LostFocus的时间,如果用户点击C ++应用程序然后你将.NET应用程序带到前台,如果用户切换到另一个应用程序然后做什么都没有。

有什么想法吗?以前做过这件事吗?我在Paint.NET中看到了类似的效果,其中工具调色板保留在另一个窗口的顶部。

paint.net

1 个答案:

答案 0 :(得分:4)

在显示之前,您是否尝试将C ++窗口设置为.NET窗体的owner?窗口句柄是会话全局的,因此您可以通过IPC进行通信。 Show方法接受任何IWin32Window作为所有者。从MSDN页面:

  

当表单由另一个表单拥有时,它将被所有者表单关闭或隐藏。例如,考虑一个名为Form2的表单,该表单由名为Form1的表单拥有。如果Form1关闭或最小化,Form2也会关闭或隐藏。 拥有的表单也不会在其所有者表单后面显示。

对评论的回应

可能这还不够明确:Owner属性的类型为Form,因此一旦表单可见,您就无法为其分配任何IWin32Window对象。但Form.Show 接受IWin32Window所有者参数 - 因此您可以在首次展示表单时将所有者设置为任意窗口。我在Reflector中查看了Form.Show,据我所见,它应该处理任何IWin32Window参数,即使它不是Form

如果您需要在第一次调用Form.Show之后设置窗口所有者,那么您可能需要PInvoke SetWindowLongas described in this answer)。这也是Form.Show的作用。