聚焦表格而不将其放在其他表格前面
Focus a form without bringing it in front of the others
使用Focus()
方法时,目标表单获得焦点,但也被带到其他表单的前面。
有没有办法避免这种 z 顺序修改?
这是一个简短的例子:
class MyForm : Form
{
static void Main(string[] args)
{
MyForm f1 = new MyForm()
{
Text = "f1"
};
f1.Show();
MyForm f2 = new MyForm()
{
Text = "f2"
};
f2.Show();
Button b1 = new Button();
b1.Click += (sender, e) => f2.Focus();
f1.Controls.Add(b1);
Button b2 = new Button();
b2.Click += (sender, e) => f1.Focus();
f2.Controls.Add(b2);
Application.Run(f1);
}
}
单击 f1
中的按钮时,f2
将获得焦点,但也会出现在 f1
的前面(这是我想避免的事情)。
不确定这是最好的方法,但我最终使用了所有者 属性 :
class MyForm : Form
{
public const int WM_NCLBUTTONDOWN = 0x00A1;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCLBUTTONDOWN:
TakeFocus();
base.WndProc(ref m);
break;
default:
base.WndProc(ref m);
break;
}
}
private void TakeFocus()
{
if (Owner == null && OwnedForms.Length > 0)
{
Form tmp = OwnedForms[0];
tmp.Owner = null;
Owner = tmp;
}
BringToFront();
}
static void Main(string[] args)
{
MyForm f1 = new MyForm()
{
Text = "f1",
};
f1.Show();
MyForm f2 = new MyForm()
{
Text = "f2",
};
f2.Owner = f1;
f2.Show();
Button b1 = new Button();
b1.Click += (sender, e) =>
{
f1.TakeFocus();
};
f1.Controls.Add(b1);
Button b2 = new Button();
b2.Click += (sender, e) =>
{
f2.TakeFocus();
};
f2.Controls.Add(b2);
Application.Run(f1);
}
}
在这个例子中,一个 window 在点击它的客户区时不会在另一个 window 前面获得焦点。
如果您单击 non-client 区域(标题栏和边框)或按钮,表单将获得焦点并显示在前面。
使用Focus()
方法时,目标表单获得焦点,但也被带到其他表单的前面。
有没有办法避免这种 z 顺序修改?
这是一个简短的例子:
class MyForm : Form
{
static void Main(string[] args)
{
MyForm f1 = new MyForm()
{
Text = "f1"
};
f1.Show();
MyForm f2 = new MyForm()
{
Text = "f2"
};
f2.Show();
Button b1 = new Button();
b1.Click += (sender, e) => f2.Focus();
f1.Controls.Add(b1);
Button b2 = new Button();
b2.Click += (sender, e) => f1.Focus();
f2.Controls.Add(b2);
Application.Run(f1);
}
}
单击 f1
中的按钮时,f2
将获得焦点,但也会出现在 f1
的前面(这是我想避免的事情)。
不确定这是最好的方法,但我最终使用了所有者 属性 :
class MyForm : Form
{
public const int WM_NCLBUTTONDOWN = 0x00A1;
protected override void WndProc(ref Message m)
{
switch (m.Msg)
{
case WM_NCLBUTTONDOWN:
TakeFocus();
base.WndProc(ref m);
break;
default:
base.WndProc(ref m);
break;
}
}
private void TakeFocus()
{
if (Owner == null && OwnedForms.Length > 0)
{
Form tmp = OwnedForms[0];
tmp.Owner = null;
Owner = tmp;
}
BringToFront();
}
static void Main(string[] args)
{
MyForm f1 = new MyForm()
{
Text = "f1",
};
f1.Show();
MyForm f2 = new MyForm()
{
Text = "f2",
};
f2.Owner = f1;
f2.Show();
Button b1 = new Button();
b1.Click += (sender, e) =>
{
f1.TakeFocus();
};
f1.Controls.Add(b1);
Button b2 = new Button();
b2.Click += (sender, e) =>
{
f2.TakeFocus();
};
f2.Controls.Add(b2);
Application.Run(f1);
}
}
在这个例子中,一个 window 在点击它的客户区时不会在另一个 window 前面获得焦点。 如果您单击 non-client 区域(标题栏和边框)或按钮,表单将获得焦点并显示在前面。