Проблемы при закрытии немодальных диалогов в .net на Windows 7 - PullRequest
1 голос
/ 18 марта 2011

Здравствуйте, у меня есть простое приложение c-sharp для Windows.У меня есть кнопка в этой форме, которая запускает другую немодальную всплывающую форму (фиксированное окно инструментов).Внутри всплывающей формы я продолжаю отслеживать сообщение Windows, которое пользователь выполняет во всплывающей форме.Всякий раз, когда пользователь закрывает форму (всплывающее окно), я устанавливаю флаг m_bQueryShutdownSent в значение true, это означает, что основная форма должна что-то делать.отследить, нажал ли пользователь кнопку закрытия и установить флаг m_bCloseButtonActive

#region WndProc
        const int WM_NCHITTEST      = 0x0084;
            const int WM_NCMOUSEMOVE = 0x00A0;
        const int HTCLOSE           = 0x0014;
        const int WM_QUERYENDSESSION  = 0x0011;
        private bool m_bCloseButtonActive = false;

        protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_NCHITTEST)
            {
                base.WndProc(ref m);
                m_bCloseButtonActive = (m.Result.ToInt32() == HTCLOSE);
            }
            else
            {
                if (m.Msg == WM_QUERYENDSESSION && this.m_oParentForm != null)
                    this.m_bQueryShutdownSent = true;

                base.WndProc(ref m);
            }
        }
        #endregion WndProc

Проблема в том, что этот фрагмент кода работает на компьютерах с XP / 32-битной версиейЭто не на Windows 7 x64 (хотя мое приложение настроено для работы в качестве 32-разрядного приложения).Всплывающий код не может обработать действие нажатия кнопки закрытия (Windows 7).Хотя это возможно на 32-битных машинах XP / XP-Embedded / 2000

Любая помощь в этом отношении высоко ценится

1 Ответ

3 голосов
/ 18 марта 2011

Понятия не имею, зачем вы это делаете.Обычно вы используете событие FormClosed, чтобы узнать, что форма закрыта.Свойство e.CloseReason сообщает, почему CloseReason.WindowsShutDown является точным эквивалентом проверки WM_QUERYENDSESSION.Если вы хотите сделать это закрытие условным, используйте вместо этого событие FormClosing.

Это также работает должным образом, когда пользователь закрывает форму с помощью средства, отличного от нажатия кнопки Закрыть.Например, нажав Alt + F4, используя системное меню или миниатюру кнопки панели задач в Win7.

...