2011-03-18 5 views
1

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

Я использую линию

m_bCloseButtonActive = (m.Result.ToInt32() == HTCLOSE); 

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

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

+0

есть подсказка ... Это вызывает из-за тем в Windows 7 Мой код работает с этой строкой Application.VisualStyleState = System.Windows.Forms.VisualStyles.VisualStyleState.ClientAreaEnabled; –

ответ

3

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

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

+0

Да, я согласен с вами, но так как я портировал это из существующего приложения. Причина, по которой я использую это, - это ситуации, в которых мне нужно отображать два немодальных всплывающих окна. Я не должен позволять пользователю закрывать форму в этом случае. Я избегаю закрытия всплывающей формы, проверяя флаг m_bCloseButtonActivechecking. Я полагаю, что эта причина связана с темами в Windows, особенно после Vista и выше. –

+0

Используйте обработчик событий FormClosing с этой строкой кода 'if (e.CloseReason == CloseReason.UserClosing) e.Cancel = true;' –

+0

Я попробовал используя событие FormClosing. Он не срабатывает по какой-то странной причине. !! Только когда мое главное окно закрывается, происходит событие форматирования окна pop. –