не могу последовательно вывести форму на передний план
Я пробовал несколько вещей, но ни одна из них не работает...
У меня есть форма, которая должна появиться перед всеми окнами при нажатии 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 ответов:
Вот как я сделал это. Обратите внимание, что
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(); }
Используйте
Activate()вместо Show(). Кроме того, если ваша форма свернута, вы должны установить ее WindowState в WindowState.Нормальным (или каким бы оно ни было до минимизации).private void notifyIcon1_Click(object sender, EventArgs e) { Activate(); // this is needed for minimized form to show WindowState = FormWindowState.Normal; }
У меня была похожая проблема; мне хватило простого обходного пути. В обработчике событий, где мне нужно показать форму, я просто проверяю, видно ли окно/нормально, и если да, то я сворачиваю его. Остальная часть кода затем возвращает его обратно.
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(); }
Попробуйте это
Эта функция работает для меня:
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); }Это вполне могут быть методы расширения.
Comments