代码之家  ›  专栏  ›  技术社区  ›  Ivan Ičin

不能总是把形式放在前面

  •  6
  • Ivan Ičin  · 技术社区  · 15 年前

    我试过几件事,但都不管用…

    我有一个窗体,单击notifyicon时,它应该出现在所有窗口的前面。下面是我的尝试:

    private void notifyIcon1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Left)
        {
            this.TopMost = true;
            this.BringToFront();
            this.Focus();
            this.TopMost = false;
        }
    }
    

    然后我尝试使用SetForegroundWindow:

    [return: MarshalAs(UnmanagedType.Bool)]
    [DllImport("user32", CharSet = CharSet.Ansi, SetLastError = true, ExactSpelling = true)]
    public static extern bool SetForegroundWindow(IntPtr hwnd);
    

    通过添加

            SetForegroundWindow(this.Handle);
    

    在if块的末尾。

    最后,我看到,如果我在notifyicon上单击鼠标右键,上下文菜单打开,当这不起作用时,我可以左键单击notifyicon,它会将它带到前面。

    我尝试在开头添加此代码:

            cmsNotifyIcon.Show();
            cmsNotifyIcon.Close();
    

    这样它就可以显示和关闭notifyicon上下文菜单,作为解决方法的一个可能想法,但没有帮助。

    有什么关于如何做到这一点的想法,或者围绕这一点工作吗?

    5 回复  |  直到 6 年前
        1
  •  5
  •   Catalin DICU    15 年前

    如果你是在老鼠身上做的呢?

        2
  •  3
  •   Matt Davis    15 年前

    我就是这么做的。注意 StartupWindowState HideWhenMinimized 是我的私人会员。

    private void OnOpenTrayMenuItemClicked(object sender, EventArgs e) {
        if (this.WindowState == FormWindowState.Minimized) {
            this.WindowState = this.StartupWindowState;
            this.ShowInTaskbar =
                (this.HideWhenMinimized && (this.WindowState == FormWindowState.Minimized)) ? false : true;
            this.Show();
        }
    
        this.Activate();
    }
    
        3
  •  1
  •   Petr Havlicek    15 年前

    使用 Activate() 而不是show()。另外,如果窗体最小化,则必须将其WindowsState设置为WindowsState.Normal(或最小化前的任何状态)。

    
            private void notifyIcon1_Click(object sender, EventArgs e)
            {
                Activate();
    
                // this is needed for minimized form to show
                WindowState = FormWindowState.Normal;
            }
    
    
        4
  •  0
  •   DotThoughts    10 年前

    我也有类似的问题,一个简单的解决方法就足够了。在我需要显示窗体的事件处理程序中,我只需检查窗口是否可见/正常,如果可见/正常,则将其最小化。剩下的代码会重新显示出来。

        private void OnDetails(object Sender, EventArgs Args)
        {
            if (DetailsForm == null)
            {
                DetailsForm = new MyForm(this);
            }
    
            if (DetailsForm.WindowState == FormWindowState.Normal)
                DetailsForm.WindowState = FormWindowState.Minimized;
    
            DetailsForm.WindowState = FormWindowState.Normal;
            DetailsForm.Show();
        }
    
        5
  •  0
  •   Walter Stabosz    6 年前

    试试这个

    此功能适用于我:

    public static void BringFormToFront(Form form) {
    
        form.Activate();
        form.TopMost = true;
        form.TopMost = false;
        form.Focus();
        form.BringToFront();
    
    }
    

    如果你想变得特别懒惰:

    public static void ShowFormToFront(Form form) {
        form.Show();
        BringFormToFront(form);
    }
    

    这些很容易 extension methods .