2012-04-11 5 views
1

Я просто хочу знать, в чем разница между этими двумя константами обмена сообщениями. Какой из них следует использовать в методе WndProc при переопределении, чтобы обрабатывать сообщение кнопки закрытия.Разница между WM_CLOSE и SC_CLOSE

+0

Вы отметили это [winforms], используйте событие FormClosing. Обратите внимание на пройденный e.CloseReason, установите e.Cancel = true, чтобы предотвратить закрытие. –

ответ

3

WM_CLOSE отправляется в виде оконного сообщения всякий раз, когда запрашивается окно, любым способом.

SC_CLOSE отправляется как параметр сообщения WM_SYSCOMMAND, когда пользователь нажимает кнопку «Закрыть» (или выбирает «Закрыть» из меню управления в окне).

Какой из них вы слушаете, определяется, какие действия вы пытаетесь перехватить или решить.

+0

Предположим, что я хочу отменить все ожидающие проверки в форме и позволить пользователю закрыть окно изящно, что бы я выбрал тогда? –

+2

Если вы хотите сделать это * всякий раз, когда окно закрывается (будь то пользователь, нажимая кнопку «Закрыть»), или кнопку в приложении, запрашивающую закрытие окна, или когда, например, диспетчер задач отправляет окно закрытое сообщение) , используйте 'WM_CLOSE'. –

+1

Приложение может запросить подтверждение пользователя перед уничтожением окна, обработав сообщение WM_CLOSE и вызвав функцию DestroyWindow, только если пользователь подтвердит выбор. –

1

Согласно msdn, CS_CLOSE является одним из значений wParam WM_SYSCOMMAND.

Окно получает это сообщение, когда пользователь выбирает команду из меню Window (ранее известное как системное меню или управления) или когда пользователя выбирает кнопку разворачивания, кнопка сворачивания, кнопки восстановления, или закрыть кнопку.

WM_CLOSE - это само сообщение.

Отправлено как сигнал о прекращении работы окна или приложения.

Таким образом, когда окно получает WM_SYSCOMMAND со значением параметра CS_CLOSE, вы можете закрыть окно (отправить сообщение WM_CLOSE).

UPDATE (если вы хотите, чтобы пользователь мог закрыть окно изящно): Приложение может запросить у пользователя подтверждение до уничтожения окна, обработав сообщение WM_CLOSE и вызвав функцию DestroyWindow, только если пользователь подтвердит выбор.

BTW, если вы используете C#, вы можете обрабатывать событие FormClosing, и вы работаете там. Если вам нужно отменить закрытие, просто установите e.Cancel = true для аргумента события.

+0

Я использовал событие закрытия формы, но это просто срабатывает после того, как выполнено событие проверки на элементе управления, которое не является поведением, которое я хочу. Я просто наткнулся на эту статью (http://radio-weblogs.com/0101134/2003/06/09.html), которая объяснила этот хак –

+1

На самом деле событие FormClosing приходит ** перед ** проверкой. Проверка произошла, потому что textBox теряет фокус при появлении сообщения «Закрыть окно?» отображается. Просто установите 'CausesValidation = false;' в верхней части обработчика события FormClosing (перед показом сообщения). –