MessageBox не отображается при открытии обработки WM_CLOSE из кнопки закрытия эскиза панели задач - PullRequest
3 голосов
/ 26 мая 2010

Попытка установить диалог «Хотите сохранить» при попытке закрыть окно с помощью кнопки «Закрыть» на миниатюре панели задач в Windows 7 (с активным просмотром аэродинамики).

Использование MessageBox () при обработке WM_CLOSE не работает. MessageBox не будет отображаться до тех пор, пока вы не переместите курсор мыши за пределы миниатюры, поэтому функция аэродинамики отключена.

Многие приложения имеют такое поведение с ошибками, так что это, вероятно, недостаток дизайна в Windows 7, но для некоторых программ это работает (Word, Notepad, Visual Studio, ...), поэтому мне интересно, какой прием они используют ( или что нужно, чтобы "выйти" из режима аэродинамики программно).

Небольшое приложение «Звукозапись», поставляемое с Windows 7, имеет ту же проблему (если вы записали что-то без сохранения и попытаетесь закрыть его с помощью кнопки «Закрыть») ...

Ответы [ 2 ]

1 голос
/ 21 января 2011

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

case WM_SYSCOMMAND:
    if (wParam == SC_CLOSE)
    {
        SetForegroundWindow(hWnd);
        MessageBox(hWnd, L"Are you sure you want to exit", L"Close Window", MB_OK);
    }
    else
    {
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    break;
0 голосов
/ 26 мая 2010

Я бы реализовал обработчик для WM_SYSCOMMAND и велел бы поведению SC_CLOSE публиковать определяемое приложением сообщение, которое отображало бы ваш пользовательский интерфейс, и публиковать WM_CLOSE в исходном окне, если пользователь хочет выйти.

В качестве альтернативы Блокнот использует диалоговое окно , а не окно сообщения. Вы пробовали это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...