Чтобы добиться этого эффекта, вам нужно сделать какое-нибудь взаимодействие с Win32. В зависимости от того, используете ли вы Winforms или WPF, способ подключения к обработке сообщений различается (я не помню Winforms, поэтому приведу все примеры для WPF). Но в обоих случаях вам необходимо:
Перехватывать создание окна и изменять стили окна и расширенные стили. В WPF вам необходимо унаследовать от HwndSource
и изменить HwndSourceParameters
, чтобы добиться этого. Вам нужны WS_OVERLAPPEDWINDOW, WS_CLIPSIBLINGS и WS_VISIBLE для обычного стиля, а также расширенные стили WS_EX_WINDOWEDGE и WS_EX_APPWINDOW.
Добавление обработчика сообщений через параметры HwndSource HwndSourceHook.
В процедуре обработки сообщений, добавленной через ловушку на втором шаге, вам необходимо обработать несколько сообщений:
WM_NCACTIVATE
- изменить рисунок заголовка, когда приложение активировано или нет
WM_NCCALCSIZE
- чтобы вернуться к ОС, в которой у вас нет клиентских областей
WM_NCPAINT
- в общем случае вам нужно отменить прямоугольник окна только здесь, WPF позаботится о реальной картине)
WM_NCHITTEST
- для обработки перемещения окна, минимизации и максимизации.
Как только вы сделаете вышеописанное, ваша клиентская область, где WPF будет рисовать ваше визуальное дерево, охватит всю область окна. Вам нужно будет добавить визуалы «non-cliet», чтобы ваше приложение выглядело как обычное приложение для пользователя.
Вам может потребоваться еще несколько сообщений:
WM_THEMECHANGED
, если вы хотите изменить рисование области, не относящейся к клиенту, в соответствии с темой ОС
WM_DWMCOMPOSITIONCHANGED
, если вы хотите расширить стекло и получить стандартную покраску стекла NC OS, когда стекло включено, и переключиться на собственную логику, если стекло не включено.
Возможно, вы захотите взглянуть на API-интерфейсы Win32 Theme, если хотите получить стандартные ресурсы Win32 для кнопок границ, заголовков, закрытия, минимизации и максимизации, которые можно использовать в области «не-клиента».
Если вы хотите расширить Glass в свое окно, вы можете посмотреть:
DwmExtendFrameIntoClientArea
- для получения стандартного стекла NC-области
DwmDefWindowProc
- чтобы диспетчер рабочего стола рисовал Glass и стандартные элементы управления NC
DwmIsCompositionEnabled
- определить, включено ли стекло; Вы можете использовать два вышеупомянутых API только при включенном Glass. Если стекло не включено, вам нужно сделать свой собственный чертеж области ЧПУ.
Вы можете найти правильные определения C # всех сообщений, стилей и соответствующих Win32 API, которые вам нужны в P / Invoke .
Вы также можете добиться аналогичного эффекта, используя стандартное окно WPF с WindowStyle=none
. Однако между поведением рабочего стола по отношению к вашему приложению и другим приложениям будут некоторые различия; Наиболее очевидным из них является то, что вы не сможете сложить или выложить мозаику по своему окну, щелкнув правой кнопкой мыши на панели задач.
Вы также можете посмотреть на некоторые сторонние компоненты, которые включают некоторые из этих функций. Я не использовал ничего (как вы можете видеть, я не боюсь взаимодействия Win32 :-)), поэтому я не могу рекомендовать вам ничего конкретного.