Окно теряет фокус

В моем приложении, когда я показываю окно сообщения и пользователь нажимает любую его кнопку, например OK или ОТМЕНА, мое окно теряет фокус и сворачивается.

Я пытался использовать set focus, а также использовать win32 API SetForegroundWindow (window hWnd), чтобы окно оставалось активным. Я заметил, что если за моим окном открыто другое приложение, окно моего приложения теряет фокус после нажатия кнопки окна сообщения, но в случае, если это единственное видимое окно на рабочем столе, оно работает нормально. Я работаю на Windows 7, но сталкиваюсь с той же проблемой и в Win XP.

Я использую ГрадиентФорм. И чтобы показать окно сообщений, я использую MessageBox.Show("Текст сообщения", "", MessageBoxButtons.OK,MessageBoxIcon). Ничего особенного.


person Zain Ali    schedule 09.03.2011    source источник
comment
Разместите здесь свой код. Это не нормальное поведение.   -  person Shoban    schedule 09.03.2011
comment
Вы тоже используете winforms - Mdiparent?   -  person Crimsonland    schedule 09.03.2011


Ответы (3)


Такого рода вещи происходят, когда нет окна, которое было бы включено, когда окно сообщения закрывается. Windows вынуждена найти другое окно, чтобы передать ему фокус, и выберет одно из другого приложения. Также объясняет, почему это не проблема, когда нет другого окна.

Убедитесь, что вы не отключили окна. Другими словами, избегайте этого:

   this.Enabled = false;
   MessageBox.Show("oops");
   this.Enabled = true;

Параметр Enabled возвращается к true, как будто это слишком поздно.

person Hans Passant    schedule 09.03.2011
comment
Прекрасное объяснение. Но я проверил в void WndProc (ref Message message) { const int WM_KILLFOCUS = 0x0008; case WM_KILLFOCUS: this.Enabled = true; это.Активировать(); возвращение; } Но та же проблема - person Zain Ali; 09.03.2011
comment
WM_KILLFOCUS не может это исправить, он отправляется, когда вы теряете фокус. Другими словами, когда отображается окно сообщения. WM_SETFOCUS тоже не исправит, фокус обратно не вернешь. Только не связывайтесь со свойством Enabled. Это не обязательно, окно сообщения модальное. - person Hans Passant; 09.03.2011
comment
Тогда что мне нужно сделать? - person Zain Ali; 10.03.2011
comment
Только не путайте свойство Enabled. Не нужно - person Hans Passant; 10.03.2011
comment
Это очень помогло. Однако у меня здесь особая ситуация - новый поток с «окном прогресса», и мне нужно отключить главное окно. Как мне это сделать, не устанавливая Enabled=false? - person Daniel Mošmondor; 16.02.2018

Я решил проблему, активировав окно с помощью setForgroundwindow() перед отображением диалогового окна, и теперь все работает нормально.

person Zain Ali    schedule 12.03.2011

Убедитесь, что вы не показываете окно сообщения в событии загрузки формы. Потому что в это время окно еще не инициализировано.

Вместо этого используйте Shown событие формы. Это решит эту проблему

person Ravi Poojara    schedule 24.03.2017