4

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

方法:

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

  • 另一种方法是检查您何时LostFocus,如果用户单击了 C++ 应用程序,那么您将 .NET 应用程序带到前台,如果用户切换到另一个应用程序则什么也不做。

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

油漆网

4

1 回答 1

4

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

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

回复评论

也许这还不够清楚:该Owner属性是 type ,因此一旦表单可见Form,您就不能为其分配任何对象。IWin32WindowForm.Show 确实接受IWin32Window所有者参数 - 因此您可以在首次显示表单时将所有者设置为任何窗口。我在 Reflector 中看过Form.Show,据我所知,它应该处理任何IWin32Window参数,即使它不是Form.

如果您需要在第一次调用之后设置窗口所有者Form.Show,那么您可能必须 PInvoke SetWindowLong如本答案中所述)。这Form.Show也是如此。

于 2012-04-25T09:12:46.617 回答