【问题标题】:How do you keep a .NET form always above another application?如何让 .NET 表单始终位于另一个应用程序之上?
【发布时间】:2012-05-05 21:22:46
【问题描述】:

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

方法:

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

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

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

【问题讨论】:

  • 在最小化 C++ 应用程序时遇到什么问题?为什么不阻止它最小化?
  • 我不明白您是否希望您的应用始终处于最佳状态?
  • 我需要将 .NET 应用程序保持在 C++ 应用程序之上。理想情况下,C++ 应用程序应该正常运行.. 可最小化、可移动、可调整大小。目前,每当用户调整 C++ 应用程序的大小时,我也会根据其尺寸调整 .NET 应用程序的大小。
  • 你试过.Net中的form.ShowDialog()
  • form.ShowDialog 会阻止与@user 下的表单交互

标签: c# .net winforms layout window


【解决方案1】:

在显示之前,您是否尝试过将 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 也是这样做的。

【讨论】:

  • 当我只有 C++ 窗口的句柄 (IntPtr) 时,我可以在 .NET 应用程序中执行此操作吗?所有者属性不需要 .NET 表单吗?
  • @Geotarget:我承认我从未尝试过,但Form.Show 接受IWin32Window,所以我希望您应该能够将任何实现IWin32Window 的对象传递给它。
  • 当我尝试它时,Form.Owner 只接受Window.Forms.Form。当我只有一个句柄时,我怎么可能将它链接到 C++ 窗口?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-09
相关资源
最近更新 更多