Проблема с MessageBox - PullRequest
       25

Проблема с MessageBox

3 голосов
/ 17 сентября 2010

У меня проблема с MessageBox, который должен быть модальным.

Вот ситуация,

  • Пользователь выбирает хх из формы
  • Появляется MessageBox
  • Пользователь открывает встроенную программную клавиатуру (встроенную, с устройства)
  • Пользователь закрывает клавиатуру
  • MessageBox теряет фокус (как? Он должен быть модальным!), А основная форма отображается на переднем плане
  • Приложение блокируется, так как пользователь не может теперь закрыть MessageBox.

Вот фрагмент кода для MessageBox.

MessageBox.Show("message", "caption", MessageBoxButtons.OK, MessageBoxIcon.Asterisk,
                                    MessageBoxDefaultButton.Button1);

Есть идеи, как это решить?

Ответы [ 3 ]

1 голос
/ 18 сентября 2010

Это на самом деле несколько ожидаемое поведение в Windows CE (я не говорю, что это правильно, просто ожидалось).

Когда вы нажимаете кнопку SIP внизу в углу рабочего стола, все ваше приложение теряет фокус, и фокус передается на панель задач. Вы можете увидеть похожую «странность», нажав на кнопку панели задач вашего приложения - MessageBox потеряет фокус, хотя по всем правам вы должны просто направлять фокус на приложение, которое уже запущено.

Вы можете увидеть, что это не ошибка CF, изменив свой вызов MessageBox следующим образом:

private void button1_Click(object sender, EventArgs e)
{
    //MessageBox.Show("message", "caption", MessageBoxButtons.OK, 
    //                                    MessageBoxIcon.Asterisk,
    //                                    MessageBoxDefaultButton.Button1);

    MessageBoxCE(this.Handle, "message", "caption", 0);
}

// renamed to not collide with the Windows.Forms MessageBox class
[DllImport("coredll", EntryPoint="MessageBox")]
private static extern int MessageBoxCE(IntPtr hWnd, string lpText, 
                                       string lpCaption, int Type);

И вы получаете точно такое же поведение.

Единственное, что не ожидается, это то, что родительская форма находится над MessageBox. Я только что проверил на устройстве CE 5.0 на базе ARM, которое у меня есть на рабочем столе, и MessageBox остается лучшим в версиях CF и P / Invoke.

Сможете ли вы воспроизвести это поведение с помощью очень простого приложения (т. Е. Только одна форма, одна кнопка)? Если так, то это похоже на проблему с платформой. При использовании CE следует помнить одну вещь: поскольку OEM-производитель имеет большой контроль над реализацией ОС, вы никогда не сможете исключить ошибку платформы для поведения.

0 голосов
/ 21 мая 2012
MessageBox.Show("Please insert Correct Username and Password.", "Login Error",
                MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
this.Focus();

Это простое решение. не нужно запускать JavaScript или другой код C #.

0 голосов
/ 17 сентября 2010

Вам необходимо включить ссылку на родительскую форму при вызове MessageBox.Show (параметр IWin32Window, как правило, просто передается в «this»). Я полагаю, что это та перегрузка, которую вы хотите использовать - см. Ниже:

MessageBox.Show Method (IWin32Window, String, String, MessageBoxButtons, MessageBoxIcon, MessageBoxDefaultButton)

Вот ссылка на документацию Microsoft.

Наслаждайтесь!

...