Как убрать кнопку Закрыть из заголовка окна

Иногда кто‑то хочет создать окно без кнопки Закрыть. Единственный способ избавиться от кнопки Закрыть — вовсе убрать системное меню: удалить стиль WS_SYSMENU у окна. Но это также устраняет кнопки Свернуть и Развернуть, так что это довольно радикально.

Если вы хотите оставить системное меню, или если вам нужны кнопки Свернуть и Развернуть, вы по крайней мере можете отключить кнопку Закрыть, деактивировав пункт SC_CLOSE в меню. Разумеется, можно пойти «ядерным» путём и реализовать собственную панель заголовка. Тогда можно делать всё, что угодно. Но большинство людей, вероятно, не готовы идти на такой крайний шаг.

Но, честно говоря, постарайтесь вообще не прятать и не отключать кнопку Закрыть. Конечным пользователям это не нравится. Это заставляет их чувствовать себя в ловушке.

Опыт Реймонда

Реймонд принимает участие в развитии Windows уже более 30 лет. В 2003 году он запустил веб‑сайт под названием The Old New Thing, который стал намного популярнее, чем он мог себе представить, и это до сих пор вызывает у него дрожь. Сайт породил книгу с тем же названием The Old New Thing (Addison Wesley, 2007). Иногда он появляется в аккаунте Windows Dev Docs в Twitter, чтобы рассказывать истории, не неся при этом полезной информации.

Обсуждение

Обсуждение закрыто. Войдите в систему, чтобы редактировать/удалять существующие комментарии.

Постарайтесь вообще не прятать и не отключать кнопку Закрыть. Конечным пользователям это не нравится. Зависит от того, чем ваше приложение занимается и предназначено ли оно для публичного релиза или для внутреннего использования.

Меня очень удивляет, что последовательность GetSystemMenu, а затем RemoveMenu не удаляет её. У меня был случай или два в .NET, когда выполнялась не прерываемая серверная операция; я выбрал окно без меню и без панели заголовка. Было бы неплохо позволить пользователю свернуть приложение в это время. Что ж.

Серверная операция обычно длилась около двух минут; обработка транзакций была нормальной, но отмена транзакции со стороны клиента была невозможна по причине фундаментального недостатка самого Windows API, связанного с каналами (pipes) к дочерним процессам.

Вы можете обработать сообщение WM_NCCALCSIZE и расширить клиентскую область в не клиентскую. Таким образом вы можете позволить DWM просто рисовать кнопки заголовка справа как обычно, а левая часть (иконка, заголовок) останется пустой, и вам потребуется лишь самим отрисовать текст заголовка окна в нужном месте. Мне кажется, это самый простой способ убрать иконку в заголовке, оставив остальное как есть.

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

(Не понимаю, почему этот комментарий неправильно размещён как ответ на комментарий yexuan)

Почему ReadDirectoryChangesW не предоставляет способа сопоставлять две стороны операции переименования? Почему уровни должностей в Microsoft начинаются с 50‑х годов, а не с более здравого номера, например с 1? Получать уведомления о публикации новых записей. Вы уверены, что хотите удалить это?