C# 将所有者设置为来自另一个流程表单的表单
我有一张表格(家长)。我还有另一个进程的表单(子进程)句柄。我需要始终在父窗体的顶部显示子窗体,并且可以使用主窗体 当我们调用:C# 将所有者设置为来自另一个流程表单的表单,c#,.net,winforms,winapi,pinvoke,C#,.net,Winforms,Winapi,Pinvoke,我有一张表格(家长)。我还有另一个进程的表单(子进程)句柄。我需要始终在父窗体的顶部显示子窗体,并且可以使用主窗体 当我们调用: public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void MainForm_Shown(object sender, EventArgs e) { var ch
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。调用传递GWL\u hwndprent
作为索引
SetWindowLongPtr(OwnedWnd, GWL_HWNDPARENT, OwnerWnd);
您可能需要手动将owner窗口按z顺序放在owner窗口前面,因为只调用上面的函数不会实现这一点。调用传递GWL\U HWNDPARENT
作为索引
SetWindowLongPtr(OwnedWnd, GWL_HWNDPARENT, OwnerWnd);
您可能需要手动将所有者窗口按z顺序置于所有者窗口之前,因为仅调用上面的函数无法实现这一点。您可以使用childForm.ShowDialog()我不能。Сhild表单已经打开,正在另一个过程中!我回滚了您的编辑。请不要通过编辑现有问题来询问新问题。请一次处理一个问题。如果你想问一个新问题,可以这样做。你可以使用childForm.ShowDialog()我不能。Сhild表单已经打开,正在另一个过程中!我回滚了您的编辑。请不要通过编辑现有问题来询问新问题。请一次处理一个问题。如果你想问一个新问题,那么就这样做。这就是SetParent()已经做过的。OP希望将其转换为子窗口,即WS_子样式标志。嗯。@HansPassant No.
SetParent
更改父项。这里的代码修改所有者。并不是说MS让人很容易知道这个名字GWL\u HWNDPARENT
。但这只是CreateWindow
中重载的hWndParent
参数。在我看来,询问者想要修改所有者。这个词出现在问题标题中,然后有一个文本,我需要始终在父窗体的顶部显示子窗体,这意味着所有者而不是父窗体。@DavidHeffernan。这有帮助,但也存在一些问题。调用SetWindowLongPtr时,子窗体将从任务栏中消失。如果您移除她的焦点并再次选择,它将再次出现在任务栏中。如何使其在调用SetWindowLongPtr时不会从任务栏中消失?我是否可以确保此子窗体始终位于主窗体中所有打开的子窗体的顶部?自有窗口没有任务栏按钮。添加WS_EX_APPWINDOW扩展样式。但这是另一个问题。我想我已经回答了你的问题。SetParent()已经做到了这一点。OP希望将其转换为子窗口,即WS_子样式标志。嗯。@HansPassant No.SetParent
更改父项。这里的代码修改所有者。并不是说MS让人很容易知道这个名字GWL\u HWNDPARENT
。但这只是CreateWindow
中重载的hWndParent
参数。在我看来,询问者想要修改所有者。这个词出现在问题标题中,然后有一个文本,我需要始终在父窗体的顶部显示子窗体,这意味着所有者而不是父窗体。@DavidHeffernan。这有帮助,但也存在一些问题。调用SetWindowLongPtr时,子窗体将从任务栏中消失。如果您移除她的焦点并再次选择,它将再次出现在任务栏中。如何使其在调用SetWindowLongPtr时不会从任务栏中消失?我是否可以确保此子窗体始终位于主窗体中所有打开的子窗体的顶部?自有窗口没有任务栏按钮。添加WS_EX_APPWINDOW扩展样式。但这是另一个问题。我想我回答了你的问题。