Как нарисовать пользовательскую кнопку в заголовке окна с Windows Forms?
========================================================================

Как нарисовать пользовательскую кнопку рядом с кнопками свертывания, разворачивания и закрытия внутри заголовка формы?

Я знаю, что вам нужно использовать вызовы Win32 API и переопределить процедуру WndProc, но я не смог найти решение, которое работает правильно.

Кто-нибудь знает как это сделать? В частности, кто-нибудь знает способ сделать это, который работает в Vista?

 у меня нет машины Vista, пригодной для тестирования, но я думаю, что ваши проблемы как-то связаны с неправильным hWnd. Во всяком случае, с плохо прокомментированным кодом.



 что это было давно с момента последнего ответа, но это действительно помогло мне в последнее время, и мне нравится обновлять код, предоставленный Крисом, с моими комментариями и модификациями.
Версия отлично работает на Win XP и Win 2003. На Win 2008 у меня есть небольшая ошибка, которую я не смог идентифицировать при изменении размеров окон. Работает и в Vista (без Aero), но обратите внимание, что кнопки в строке заголовка не квадратные, и размеры кнопок должны это учитывать.

Код демонстрирует сообщения, которые должны быть обработаны и как их обрабатывать.
Код использует коллекцию пользовательских объектов TitleBarButton. Этот класс слишком велик, чтобы включать его, но я могу предоставить его при необходимости вместе с примером.



[Редактировать: Код удален, см. Мой другой ответ]

Реальная проблема заключается в изменении состояния и обнаружении щелчков на кнопке ... для этого вам нужно подключиться к глобальному обработчику сообщений для программы. Похоже, что .NET скрывает события мыши для формы, а не в реальном контейнере области (т. е. мышь перемещается и щелкает в строке заголовка). Я ищу информацию об этом, нашел ее сейчас, я работаю над этим, не должно быть слишком сложно ... Если мы сможем выяснить, что эти сообщения на самом деле пропускают.