Подтвердить что ты не робот

Каков "правильный" способ принести приложение Windows Forms на передний план?

Я пишу приложение Windows Forms в С#. Мне нужно уметь вывести его на передний план. После некоторого Googling и экспериментов у меня есть рабочее решение, которое выглядит довольно взломанным.

Я хотел бы знать элегантный способ сделать это, если он есть. Мне нужно приложение для восстановления и выйти на передний план, было ли оно сведено к минимуму или не сведено к минимуму, но в фоновом режиме.

Текущий код выглядит следующим образом:

WindowState = FormWindowState.Minimized;
WindowState = FormWindowState.Normal;
BringToFront();
Focus();
4b9b3361

Ответ 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, запущенных последовательно в разных потоках и закрытых по пользовательскому коду