не может последовательно вывести форму на передний план - PullRequest
6 голосов
/ 06 января 2010

Я пробовал несколько вещей, но ни одна из них не работает ...

У меня есть форма, которая должна появиться перед всеми окнами при нажатии 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 ]

5 голосов
/ 06 января 2010

что если вы сделаете это на MouseUp?

3 голосов
/ 06 января 2010

Вот как я это сделал. Обратите внимание, что 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();
}
1 голос
/ 06 января 2010

Используйте Activate() вместо Show (). Также, если ваша форма свернута, вы должны установить для WindowState значение WindowState.Normal (или любое другое состояние, которое было до минимизации).


        private void notifyIcon1_Click(object sender, EventArgs e)
        {
            Activate();

            // this is needed for minimized form to show
            WindowState = FormWindowState.Normal;
        }

0 голосов
/ 01 февраля 2018

Попробуйте это

Эта функция у меня работает:

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

Это могут быть методы расширения .

0 голосов
/ 23 апреля 2014

У меня была похожая проблема; мне хватило простого обходного пути. В обработчике событий, где мне нужно показать форму, я просто проверяю, видимы ли окна / нормальные, и если это так, то я минимизирую их. Затем остальной код возвращает его обратно.

    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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...