【问题标题】:Set owner to form from another process form将所有者设置为来自另一个流程表单的表单
【发布时间】:2014-09-05 13:26:22
【问题描述】:

我有一个表单(父级)。我也有处理来自另一个进程的表单(子)。我需要始终在父表单之上显示子表单,并且可以使用主表单。

当我们调用时它起作用:

public partial class MainForm : Form
{
    public MainForm()
    {
        InitializeComponent();
    }

    private void MainForm_Shown(object sender, EventArgs e)
    {
        var childForm = new Form();
        childForm.Show(this);
    }
}

此外,如果主窗体关闭,来自另一个进程的子窗体将继续工作。

我尝试使用 pinvoke SetParent() 函数,但它将子窗体设置为 MDI。

【问题讨论】:

  • 你可以使用 childForm.ShowDialog()
  • 我不能。 Сhild 表单已经打开并且正在另一个进程中!
  • 我回滚了您的编辑。请不要通过编辑现有问题来提出新问题。请一次处理一个问题。如果您想提出新问题,请这样做。

标签: c# .net winforms winapi pinvoke


【解决方案1】:

调用SetWindowLongPtr 传递GWL_HWNDPARENT 作为索引。

SetWindowLongPtr(OwnedWnd, GWL_HWNDPARENT, OwnerWnd);

您可能需要手动将拥有的窗口按 z 顺序置于所有者窗口的前面,因为仅调用上面的函数不会发生这种情况。

【讨论】:

  • 这就是 SetParent() 已经做的。 OP 想把它变成一个子窗口,WS_CHILD 风格的标志。嗯。
  • @HansPassant No. SetParent 更改父级。这里的代码修改了所有者。并不是说 MS 使用名称 GWL_HWNDPARENT 很容易知道这一点。但这只是来自CreateWindow 的重载hWndParent 参数。在我看来,提问者想要修改所有者。这个词出现在问题标题中,然后有这样的文字我需要始终在父窗体之上显示子窗体,这意味着所有者而不是父窗体。
  • @DavidHeffernan。它有所帮助,但存在一些问题。当您调用 SetWindowLongPtr 时,子窗体会从任务栏中消失。如果您移开她的焦点并再次选择,它会再次出现在任务栏中。如何使它在调用 SetWindowLongPtr 时不会从任务栏中消失?我可以让这个子表单始终位于主表单中所有打开的子表单之上吗?
  • 拥有的窗口没有任务栏按钮。添加 WS_EX_APPWINDOW 扩展样式。这是一个不同的问题。我想我回答了你问的那个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-31
  • 1970-01-01
  • 2014-07-08
  • 2012-04-04
  • 1970-01-01
相关资源
最近更新 更多