C# MessageBox на передний план, когда приложение свернуто в трей

У меня есть код, который выскакивает окно сообщения:

MessageBox.Show(this,
                 "You have not inputted a username or password. Would you like to configure your settings now?",
                 "Settings Needed",
                 MessageBoxButtons.YesNo,
                 MessageBoxIcon.Question);

Моя проблема, когда это всплывает, мое приложение обычно сворачивается в трей. В результате окно сообщения не выходит вперед, и оно также не появляется вдоль панели запуска. Единственный способ увидеть это с помощью alt-tabbing.

Вот код, который минимизирует мое приложение (родитель) в трей:

if (FormWindowState.Minimized == WindowState)
{                
      Hide();                
}

5 ответов

Решение

Ты можешь попробовать вот так

MessageBox.Show(new Form() { TopMost = true }, "You have not inputted a username or password. Would you like to configure your settings now?",
                 "Settings Needed",
                 MessageBoxButtons.YesNo,
                 MessageBoxIcon.Question);

Там есть дополнительный флаг, который вы можете указать в качестве опции для стандартной Windows MessageBox функция, которая не отображается в оболочке WinForms.

То, что вы ищете, называется MB_TOPMOST, который гарантирует, что окно сообщения отображается как самое верхнее окно над всем остальным на вашем рабочем столе. Просто измените свой код, как показано ниже:

MessageBox.Show(this,
                "You have not inputted a username or password. Would you like to configure your settings now?",
                "Settings Needed",
                MessageBoxButtons.YesNo,
                MessageBoxIcon.Question,
                MessageBoxDefaultButton.Button1,  // specify "Yes" as the default
                (MessageBoxOptions)0x40000);      // specify MB_TOPMOST

Мне это нужно было только для тестирования, поэтому, если вы не возражаете, чтобы быть слишком дрянным, MessageBoxOptions.ServiceNotification сделает свое дело...

        MessageBox.Show(message,
            "Error",
            MessageBoxButton.YesNo,
            MessageBoxImage.Exclamation,
            MessageBoxResult.OK,
            MessageBoxOptions.ServiceNotification);

MessageBox поверх всех окон (без иконки в трее):

MessageBox.Show(new Form() { TopMost = true }, boxText, "Box Title",
                MessageBoxButtons.OK, boxIcon);

MessageBox и ваше приложение поверх всех окон (без иконки в трее):

TopMost = true;
MessageBox.Show(boxText, "Box Title", MessageBoxButtons.OK, boxIcon);
TopMost = false;

MessageBox поверх всех окон, плюс иконка в трее (приложение теряет фокус):

MessageBox.Show(boxText, "Box Title", MessageBoxButtons.OK, boxIcon, 0,
                MessageBoxOptions.DefaultDesktopOnly);
// (The "0" can also be "MessageBoxDefaultButton.Button1".)

MessageBoxButtons.OK а также boxIcon необязательные аргументы в первых двух.

Установка TopLevel не делает муравейник; это уже правда.

Нет прямого способа центрировать MessageBox на его родительской форме. (За исключением, может быть, центрирования родительской формы.)

Более правильный способ сделать это - установить владельца MessageBox.

Другие вопросы по тегам