0

使用该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);
    }
}

单击 中的按钮时f1f2将获得焦点但也会出现在前面f1(这是我想避免的事情)。

4

1 回答 1

0

不太确定这是最好的方法,但我最终使用了 owner 属性:

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);
    }
}

在这个例子中,当点击它的客户区时,一个窗口不会在另一个窗口前面获得焦点。如果您单击非客户区(标题栏和边框)或按钮,表单将获得焦点并被带到前面。

于 2016-12-16T10:23:25.667 回答