是否可以将一个表单放在另一个表单之上,而不是在TopMost之上?

Thi*_*ago 4 .net c# topmost winforms

我想做的很简单:将WinForm放在另一个之上,而不是最顶层。就像,当我单击一个窗口时,我的winform会在它的顶部,但是当我单击其他东西(例如浏览器)时,我的窗体就不会在它的顶部。

类似于TopMost WinForm,但仅用于特定过程。(我正在为游戏制作叠加层,因此我只需要在游戏上使用叠加层即可。)

有帮助的图片(红色边框内的所有内容都是我的表格):在此处输入图片说明

然后,当我切换到另一个窗口(在本例中为资源管理器)时,我希望表单位于背景中,就像《英雄联盟》客户端一样在此处输入图片说明

Rez*_*aei 6

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

var f = new Form();
f.Owner = this;
f.Show();
Run Code Online (Sandbox Code Playgroud)

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

为此,您应该首先找到另一个进程的窗口句柄,然后使用SetWindowLongAPI函数将其设置为表单的所有者,例如:

//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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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