我有一个作为主应用程序运行的C ++应用程序。 .NET应用程序也是并行运行的,我通过套接字进行进程间通信。如何在.NET应用程序上面维护.NET主窗体?
方法:
目前我设置了TopMost = true
,但是当您打开另一个应用程序时会出现问题:.NET应用程序出现在所有其他应用程序之上。
另一种方法是检查你LostFocus
的时间,如果用户点击C ++应用程序然后你将.NET应用程序带到前台,如果用户切换到另一个应用程序然后做什么都没有。
有什么想法吗?以前做过这件事吗?我在Paint.NET中看到了类似的效果,其中工具调色板保留在另一个窗口的顶部。
答案 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 SetWindowLong
(as described in this answer)。这也是Form.Show
的作用。