是否可以将表单保留在另一个表单之上,但不能保留TopMost?

时间:2017-08-27 04:14:46

标签: c# .net winforms topmost

我想做的很简单:让我的WinForm在另一个上面,但不是最顶层。 就像,当我点击一个窗口时,我的winform将位于它之上,但是当我点击其他东西时,比如浏览器,我的表单将不会在它上面。

与TopMost WinForm类似,但仅适用于特定进程。 (我为游戏制作了一个叠加层,所以我需要它才能在游戏中成为最重要的。)

要提供帮助的图片(红色边框内的所有内容都是我的表单):enter image description here

然后当我换到另一个窗口(在本例中为Explorer)时,我希望我的表单在后台,就像英雄联盟客户enter image description here

2 个答案:

答案 0 :(得分:4)

所拥有的表单始终显示在其所有者表单的顶部。要创建所有者拥有的表单,您可以将所有者表单的引用分配给所拥有表单的Onwer属性,例如:

var f = new Form();
f.Owner = this;
f.Show();

将另一个进程的窗口设置为所有者

为此,您应首先找到其他进程的窗口句柄,然后使用SetWindowLong API函数,您可以将其设置为表单的所有者,例如:

//using System.Runtime.InteropServices;
//using System.Diagnostics;

[DllImport("user32.dll", EntryPoint = "SetWindowLong", CharSet = CharSet.Auto)]
public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, IntPtr dwNewLong);
private void button1_Click(object sender, EventArgs e)
{
    var notepad = Process.GetProcessesByName("notepad").FirstOrDefault();
    if(notepad!=null)
    {
        var owner = notepad.MainWindowHandle;
        var owned = this.Handle;
        var i = SetWindowLong(owned, -8 /*GWL_HWNDPARENT*/, owner);
    }
}

在上面的示例中,您的表单将始终位于记事本窗口的顶部。

答案 1 :(得分:0)

如果是表格,则可以使用以下代码将其作为模态对话框打开:

    var modalForm = new Form();
    modalForm .ShowDialog();

ShowDialogue()将始终将表单作为创建它的顶层表单打开。但有一个问题是,在关闭模态对话框之前,您无法对父表单执行任何操作。

相关问题