是否可以将一个表格放在另一个表格之上,而不是 TopMost?
Is it possible to keep a Form on top of another, but not TopMost?
我想做的很简单:将我的 WinForm 放在另一个之上,但不是最上面。
比如,当我点击一个 window 时,我的 winform 会在它上面,但是当我点击其他东西时,比如浏览器,我的表单不会在它上面。
类似于 TopMost WinForm,但仅适用于特定进程。
(我正在为游戏制作叠加层,所以我需要它仅在游戏中位于最上面。)
图片帮助(红色边框内的所有内容都是我的表格):
然后当我切换到另一个 window(在本例中为资源管理器)时,我希望我的表单处于后台,就像英雄联盟客户端一样
拥有的表单始终显示在其所有者表单的顶部。要使所有者拥有一个表单,您可以将所有者表单的引用分配给拥有的表单的 Onwer
属性,例如:
var f = new Form();
f.Owner = this;
f.Show();
将另一个进程的 Window 设置为所有者
要做到这一点,你应该首先找到其他进程的window句柄,然后使用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);
}
}
在上面的示例中,您的表单将始终位于记事本的顶部 window。
如果它是一个表单,那么您可以使用以下代码将其作为模态对话框打开:
var modalForm = new Form();
modalForm .ShowDialog();
ShowDialogue() 将始终将窗体作为创建它的顶级窗体打开。但一个问题是,在关闭模态对话窗体之前,您无法对父窗体执行任何操作。
我想做的很简单:将我的 WinForm 放在另一个之上,但不是最上面。 比如,当我点击一个 window 时,我的 winform 会在它上面,但是当我点击其他东西时,比如浏览器,我的表单不会在它上面。
类似于 TopMost WinForm,但仅适用于特定进程。 (我正在为游戏制作叠加层,所以我需要它仅在游戏中位于最上面。)
图片帮助(红色边框内的所有内容都是我的表格):
然后当我切换到另一个 window(在本例中为资源管理器)时,我希望我的表单处于后台,就像英雄联盟客户端一样
拥有的表单始终显示在其所有者表单的顶部。要使所有者拥有一个表单,您可以将所有者表单的引用分配给拥有的表单的 Onwer
属性,例如:
var f = new Form();
f.Owner = this;
f.Show();
将另一个进程的 Window 设置为所有者
要做到这一点,你应该首先找到其他进程的window句柄,然后使用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);
}
}
在上面的示例中,您的表单将始终位于记事本的顶部 window。
如果它是一个表单,那么您可以使用以下代码将其作为模态对话框打开:
var modalForm = new Form();
modalForm .ShowDialog();
ShowDialogue() 将始终将窗体作为创建它的顶级窗体打开。但一个问题是,在关闭模态对话窗体之前,您无法对父窗体执行任何操作。