sdileep1 Ответов: 2

Как показать фокус на окне сообщения


Я создал приложение на основе Windows Form, используя c#.

У меня есть кнопка "Отмена" на главной форме.
Когда пользователь выбирает кнопку "Отмена", он отображает окно сообщения (да/нет).
<pre lang="c#">MessageBox.Show(this,"Are you sure to exit the application", "Title", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);


До тех пор, пока пользователь не выберет либо "да", либо "нет", окно сообщения все еще будет отображаться в основной форме.

Теперь, если пользователь выбирает " X " закрыть окно из Панели задач, фокус смещается с окна сообщения на основную форму.

Как показать фокус на окне сообщения в приведенном выше сценарии.

Не могли бы вы, пожалуйста, кто-нибудь помочь в этом.

Заранее спасибо.

2 Ответов

Рейтинг:
1

Ralf Meier

Этот код (VB.NET , я знаю) должен работать так, как ты хочешь :

Protected Overrides Sub OnFormClosing(e As System.Windows.Forms.FormClosingEventArgs)
    Dim myResult As DialogResult = MessageBox.Show("FormClosing-Message", "Caption-Text", MessageBoxButtons.YesNo)

    If myResult = Windows.Forms.DialogResult.No Then
        e.Cancel = True
    End If
    MyBase.OnFormClosing(e)
End Sub


Обновление, чтобы получить MessageBox всегда сверху :

Protected Overrides Sub OnFormClosing(e As System.Windows.Forms.FormClosingEventArgs)
    Dim myResult As DialogResult = MessageBox.Show(Me, "FormClosing-Message", "Caption-Text", MessageBoxButtons.YesNo)

    If myResult = Windows.Forms.DialogResult.No Then
        e.Cancel = True
    End If
    MyBase.OnFormClosing(e)
End Sub


lukeer

Вот что имел в виду ОГ после "Ах!" (я думаю). Спасибо за объяснение.

Ralf Meier

Вы правы...
Это было объяснено ОГ - но я предположил, что исследователь не понял это правильно - поэтому я написал это как код.

sdileep1

Я тоже попробовал это сделать. но это бесполезно. Проблема все еще существует, нажав кнопку Панель задач закрыть значок окна, прежде чем делать какие-либо действия в окне сообщения.

Ralf Meier

Пожалуйста, опубликуйте свой фактический код.
Я проверил его, и он работает ... (также с панелью задач-CloseIcon)

Рейтинг:
1

OriginalGriff

Когда я попробую это сделать (исправив ваш код так, чтобы он компилировался):

DialogResult result = MessageBox.Show(this, "Please confirm", "Are you sure to exit the application", MessageBoxButtons.YesNo);
Или
DialogResult result = MessageBox.Show("Please confirm", "Are you sure to exit the application", MessageBoxButtons.YesNo);
Результат тот же: вы не можете нажать кнопку "X", чтобы закрыть диалоговое окно, оно неактивно.
И попытка нажать кнопку "X" на главной форме тоже не работает - потому что диалоговое окно является модальным, и основная форма не будет реагировать, пока она не будет закрыта.

Так что же именно вы делаете по - другому-потому что я подозреваю, что ваш код не похож на то, что вы нам показали...

"Я думаю, что он нажимает на значок панели задач, который предлагает крошечный красный крестик, чтобы закрыть приложение "снаружи""

"да"


А!

В этом случае все просто: обработайте событие FormClosing и покажите окно сообщения из него: вы можете отменить закрытие с помощью FormClosingEventArgs.свойство Cancel


"
I have tried that. But, issue is still exist.
In 'Cancel' button event, i have added FormClosingEventArgs.Cancel= false;
Then In Form Closing event, added the Message box to display.

When i clicked on cancel button, message box displayed. Then again i have clicked on task bar icon close window, focus is moving from message box to Main Window.

"


Я сам попробовал это сделать, изменив существующее приложение:
/// <summary>
/// Save the size and location (if the used doesn't
/// override it)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
    {
    DialogResult result = MessageBox.Show("Please confirm", "Are you sure to exit the application", MessageBoxButtons.YesNo);
    if (result != DialogResult.Yes)
        {
        e.Cancel = true;
        return;
        }
    if ((ModifierKeys & Keys.Shift) == 0)
        {
        this.SaveLocation();
        }
    }

Я запускаю приложение, навожу курсор мыши на панель задач и нажимаю "X" - появляется окно сообщения.
Если я затем снова наведу курсор мыши на панель задач, то получу два окна предварительного просмотра и смогу переключить фокус на "основную" форму из диалогового окна, но ничего не смогу с ней сделать - все, что я получу, это звуковой сигнал по умолчанию, если попытаюсь.

Я подозреваю, что это "особенность" windows, и нет никакого реального способа избавиться от нее.

Так что...вам придется обойти это.
Потерпи меня здесь...

Начните с добавления новой формы в ваш проект - назовите ее MyMessageBox
Установите подпись, добавьте метку, чтобы предложить пользователю закрыть ее, и добавьте две кнопки: вызовите одну "butYes", другую "butNo" и установите текст соответствующим образом. Установите для свойства DialogResult для каждой кнопки значения "да" и "нет" соответственно.
Задайте свойства формы "AcceptButton" в "butYes", и "кнопку Отменить" на "но".
Задайте свойства формы "ShowInTaskBar" на "false", и "StartPosition" в "CenterParent".

Теперь вернитесь к своей основной форме и добавьте две частные переменные класса:
private bool checkClosing = false;
private MyMessageBox closeConfirm = null;

Измените обработчик событий FormClosing:
private void frmMain_FormClosing(object sender, FormClosingEventArgs e)
    {
    checkClosing = true;
    closeConfirm = new MyMessageBox();
    DialogResult result = closeConfirm.ShowDialog();
    checkClosing = false;
    closeConfirm = null;
    if (result != DialogResult.Yes)
        {
        e.Cancel = true;
        return;
        }
    }
(Технически, вы только нуждаетесь в closeConfirm переменной, но...)
Теперь добавьте новый обработчик событий формы: активирован
private void frmMain_Activated(object sender, EventArgs e)
    {
    if (checkClosing && closeConfirm != null)
        {
        closeConfirm.Activate();
        }
    }

Скомпилируйте и попробуйте его.


sdileep1

да. Я обновил свой вопрос выше.
Спасибо.
Я имею в виду, что окно X Close из панели задач не выделено серым цветом.

Sinisa Hajnal

Я думаю, что он нажимает на значок панели задач, который предлагает крошечный красный крестик, чтобы закрыть приложение "снаружи"

sdileep1

Да.

OriginalGriff

Ответ обновлен.

sdileep1

Я уже пытался это сделать. Но проблема все еще существует.
В событии кнопки "Отмена" я добавил FormClosingEventArgs.Отмена= ложь;
Затем в событии закрытия формы добавлено окно сообщения для отображения.

Когда я нажал на кнопку отмены, появилось окно сообщения. Затем я снова нажал на значок панели задач закрыть окно, фокус перемещается из окна сообщения в Главное окно.

Ralf Meier

взгляните на мое решение (3)

OriginalGriff

Ответ обновлен.

Ralf Meier

@О. Г.: Если вы даете отправителю/рук также к функции MessageBox-назовем его остается всегда на высоте.
Может быть, вы и это проверите ...

Ralf Meier

Я также обновил свой ответ.