如何使一个.NET窗体始终位于其他应用程序之上?

4
我有一个主要运行的C++应用程序,同时还有一个.NET应用程序通过套接字进行进程间通信。我该如何保持.NET主窗体在C++应用程序上面?
方法:
- 目前,我已将 TopMost=true 设置为true,但是当您打开另一个应用程序时会出现问题:.NET应用程序会显示在所有其他应用程序之上。 - 另一种方法是在失去焦点时检查用户是否单击了C++应用程序,然后将.NET应用程序置于前景,如果用户切换到另一个应用程序,则不执行任何操作。
有什么想法吗?以前做过这样的事情吗?我在Paint.NET中看到了类似的效果,其中工具调色板保留在其他窗口的上方。

当你最小化C++应用程序时,你遇到了什么问题?为什么不阻止它被最小化? - Zenwalker
我不明白你是否想让你的应用程序始终保持在顶部? - Likurg
我需要让.NET应用程序在C++应用程序之上。理想情况下,C++应用程序应该正常运行,可以最小化、移动和调整大小。目前,每当用户调整C++应用程序的大小时,我也会根据其尺寸调整.NET应用程序的大小。 - Robin Rodricks
你尝试过在 .Net 中使用 form.ShowDialog() 吗? - Developer
form.ShowDialog会阻止与底层窗体的交互。 - KingCronus
1个回答

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(如 此答案 中所述)。这也是 Form.Show 做的事情。


当我只有C++窗口的句柄(IntPtr)时,我能在.NET应用程序中做到这一点吗?所有者属性不需要.NET表单吗? - Robin Rodricks
@Geotarget:我承认我从未尝试过,但Form.Show接受一个IWin32Window,所以我希望您应该能够传递任何实现IWin32Window的对象。 - Niki
当我尝试时,Form.Owner 只接受 Window.Forms.Form。当我只有一个句柄时,我该如何将其链接到 C++ 窗口? - Robin Rodricks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接