Каков "правильный" способ принести приложение Windows Forms на передний план?
Я пишу приложение Windows Forms в С#. Мне нужно уметь вывести его на передний план. После некоторого Googling и экспериментов у меня есть рабочее решение, которое выглядит довольно взломанным.
Я хотел бы знать элегантный способ сделать это, если он есть. Мне нужно приложение для восстановления и выйти на передний план, было ли оно сведено к минимуму или не сведено к минимуму, но в фоновом режиме.
Текущий код выглядит следующим образом:
WindowState = FormWindowState.Minimized;
WindowState = FormWindowState.Normal;
BringToFront();
Focus();
Ответы
Ответ 1
Вы пробовали Form.Activate?
Этот код, похоже, делает то, что вы хотите, путем восстановления формы до нормального размера, если свести к минимуму, а затем активировать ее для установки фокуса:
if (this.WindowState == FormWindowState.Minimized)
{
this.WindowState = FormWindowState.Normal;
}
this.Activate();
Предупреждение: это раздражает! Если это просто приложение для вашего личного использования, как вы говорите, возможно, вы сможете жить с ним.:)
Ответ 2
Примечание. Ниже я скопировал самый проголосовавший ответ в связанном вопросе, который был закрыт как дубликат этого. Этот ответ - единственный чистый ответ С#, который я нашел, который решает эту проблему.
this.WindowState = FormWindowState.Minimized;
this.Show();
this.WindowState = FormWindowState.Normal;
Он всегда выводит нужное окно перед всеми остальными.
Ответ 3
private static class User32
{
[DllImport("User32.dll")]
internal static extern IntPtr SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
internal static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
internal static readonly IntPtr InvalidHandleValue = IntPtr.Zero;
internal const int SW_MAXIMIZE = 3;
}
public void Activate()
{
Process currentProcess = Process.GetCurrentProcess();
IntPtr hWnd = currentProcess.MainWindowHandle;
if (hWnd != User32.InvalidHandleValue)
{
User32.SetForegroundWindow(hWnd);
User32.ShowWindow(hWnd, User32.SW_MAXIMIZE);
}
}
Ответ 4
Вы можете установить .TopMost
значение true, вызвать DoEvents()
, а затем установить .TopMost
обратно на значение false. Он все еще взламывает, но если Активировать и Показать не работают, это лучше, чем минимизация/повторное отображение.
Ответ 5
После большого количества проб и ошибок я добрался до этого кода.
Это проверено.
Метод BringToFront вызывается в вашей форме после того, как фокус был передан на него. Это заставляет его всплывать спереди.
[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
public static bool BringToFrontCustom(Form f)
{
bool toReturn = true;
try
{
//This is the same as the name of the executable without the .exe at the end
Process[] processes = Process.GetProcessesByName("MyFormName");
SetForegroundWindow(processes[0].MainWindowHandle);
f.BringToFront();
}
catch(Exception e)
{
toReturn = false;
MessageBox.Show("Something went wrong, Please bring the window to front manually");
}
return toReturn;
}
Ответ 6
Настройка Form.TopMost
на true
заставит окно формы перейти на передний план.
Ответ 7
set .TopMost = true
и используйте
ShowDialog()
Ответ 8
Собственно, просто вызовите Activate()
внутри события Shown
.
В Example.Designer.cs
:
this.Shown += new System.EventHandler(this.Example_Shown);
В Example.cs
:
private void Example_Shown(object sender, EventArgs e)
{
this.Activate();
}
Это сработало, даже если ваша форма запускается другим процессом (например: форма заставки в другом потоке).
Ответ 9
У меня была аналогичная проблема, к которой
form.TopMost = true;
form.Activate();
было вполне удовлетворительным решением.
Но он все еще не гарантирует, что форма будет иметь фокус, потому что TopMost
может не всегда работать, в зависимости от того, как пользователь взаимодействовал раньше с окнами в других процессах:
TopMost не работает при использовании в Forms, запущенных последовательно в разных потоках и закрытых по пользовательскому коду