Привет, Хабр!

Около трёх месяцев назад, я и мой друг - начинающие .NET разработчики, решили разработать свои виджеты на рабочий стол Windows, так как официальных нормальных виджетов нет (те что в Windows 11 не считаются). Недавно мы выпустили наш проект в релиз, пока что есть 2 виджета (Погода и Заметки), но вскоре их может быть больше! Проект называется Fancy Widgets и мы хотим поделиться им с вами. Вы можете попробовать наши виджеты, скачав их с нашего сайта fancy-widgets.onrender.com. Это наш pet-проект и поэтому он ни на что не претендует, мы просто делали его для себя и для удовольствия. Но мы будем рады услышать ваше мнение и предложения по улучшению нашего продукта. Вы можете оставить свои комментарии под этой статьей или написать нам на нашу почту fancy.widgets.help@gmail.com. Цель этой статьи - вкратце рассказать о нашем проекте и о сложностях, которые возникли у нас при разработке. Мы надеемся, что вы найдете нашу статью интересной и полезной. Приятного чтения! ????

Fancy Widgets
Fancy Widgets

Цели проекта

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

Реализация проекта

Для реализации нашего проекта мы выбрали AvaloniaUI - современный кроссплатформенный фреймворк для создания графических пользовательских интерфейсов на С#. Мы выбрали этот фреймворк, потому что он имеет ряд преимуществ, таких как:

  • Популярность и активность сообщества. AvaloniaUI является одним из самых популярных и развивающихся фреймворков для десктоп разработки на C#, что обеспечивает ему хорошую документацию, множество примеров, статей и видеоуроков.

  • Простота и гибкость.

  • Производительность и качество. AvaloniaUI использует Skia - библиотеку для рендеринга графики, которая обеспечивает высокую скорость и качество отображения графических элементов.

До начала работы над Fancy Widgets у нас не было большого опыта в десктоп разработке (мы только пробовали MAUI и WPF), поэтому нам нужен был фреймворк, который был бы несложным в изучении и использовании, но при этом достаточно мощным и функциональным. Мы рассмотрели несколько альтернативных фреймворков, но остановили свой выбор на AvaloniaUI по следующим причинам:

  • MAUI нам показался не очень стабильным и “тяжелым” фреймворком, который требует много ресурсов и времени для настройки и запуска приложений, что не очень подходит нам. (Проблема ещё в том, что необходимо устанавливать множество рабочих нагрузок, которые весят немало).

  • WPF мы отбросили просто потому что он устарел.

Fancy Widgets делится на 2 отдельных приложения: главное приложение, в котором мы видим все добавленные нами виджеты, которые мы можем включить/выключить (Виджеты скачиваются с нашего сайта и ложатся по пути C:\Users\USERNAME\Documents\Widgets). и служба, контролирующая запуск/закрытие виджетов. Эти 2 приложения связаны между собой посредством TCP соединения (этот способ показался нам наиболее простым и быстрым для обеспечения межпроцессного взаимодействия).

Что было сложно?

Одна из сложностей была связана с освоением XAML - языка разметки, который используется для создания пользовательских интерфейсов в AvaloniaUI. Поскольку мы привыкли к HTML и CSS, нам было не очень удобно работать с XAML, который имеет другой синтаксис и логику. Нам пришлось изучить, как писать стили, темы, шаблоны, привязки данных и другие элементы XAML. Но со временем мы смогли адаптироваться к этому языку и создать красивое и функциональное приложение для управления виджетами, а также сами виджеты.

Главной сложностью при разработке Fancy Widgets было обеспечение "нативного" опыта использования виджетов на Windows. Виджеты не должны показываться среди окон при нажатии Alt+Tab и не должны сворачиваться на Win+D. Для этого нам пришлось использовать вызов функций WinAPI из C# кода (P/Invoke). Это было довольно сложно и рискованно, так как использование WinAPI может привести к непредсказуемым результатам и ошибкам (например, сворачиванию панели задач или другим забавным багам). Но после многих экспериментов и тестов мы смогли подобрать нужные функции и последовательность их вызовов (да, это влияло на результат) и в итоге наши виджеты стали вести себя так, как мы хотели.

Еще одна сложность была связана с управлением памятью и производительностью нашего приложения. Мы столкнулись с проблемой утечек памяти из-за объектов типа Bitmap, которые используются для отображения графических элементов в наших виджетах. Оказалось, что эти объекты попадают в Large Object Heap (LOH) - специальную область памяти для больших объектов, которая не очищается сборщиком мусора так часто, как обычная область памяти. Это приводило к тому, что наше приложение занимало все больше и больше памяти и становилось медленнее. Мы решили эту проблему в основном использованием метода GC.Collect(), который принудительно запускает сборку мусора и освобождает память от неиспользуемых объектов.

Но есть одна нерешенная проблема - скорость работы и потребление ОЗУ тем самым Bitmap. При добавлении картинки в виджет или в главное приложение для управления виджета, происходит сильное снижение производительности приложения. Что с этим делать мы не знаем, поэтому если есть идеи, пожалуйста напишите в комментариях под статьёй.

Кастомизация виджетов

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

Пример кастомизации виджета погоды
Пример кастомизации виджета погоды

Конечно, есть возможность изменить размер виджета. Для этого нужно зажать Ctrl и нажать правой кнопкой мыши по виджету и в контекстном меню выбрать "Edit". После изменения размеров, в контекстном меню нажмите "Disable Editing".

Изменение размера виджета
Изменение размера виджета

Таким образом, мы предоставляем пользователям широкие возможности для кастомизации наших виджетов. Мы считаем, что это делает наш проект более интересным и полезным.

Заключение

В этой статье я поделился с вами нашим проектом Fancy Widgets. Мы рассказали вам, зачем мы решили создать виджеты для рабочего стола Windows, какие технологии мы использовали, с какими проблемами мы столкнулись и какие виджеты мы сделали. Мы надеемся, что вы получили удовольствие от чтения нашей статьи и узнали что-то новое и интересное.

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

Мы очень ценим ваше мнение о нашем проекте. Пожалуйста, напишите нам свои отзывы, комментарии, пожелания или вопросы под этой статьей или на нашу почту fancy.widgets.help@gmail.com. Мы будем рады общению с вами и ответим на все ваши сообщения.

Спасибо за то, что прочитали нашу статью и заинтересовались нашим проектом. Мы желаем вам всего хорошего и удачи! ????

Комментарии (10)


  1. rum
    07.08.2023 11:04
    +2

    Добрый день! Вы молодец, что решили поделиться своим пет-проектом с сообществом. Будете еще больше молодец, если опубликуете исходный код на Github/Gitlab или любом другом любимом аналоге. Это, уже можно сказать, практически правила хорошего тона =) А еще можно подумать над публикацией приложения в Microsoft Store, раз уж вы целите в Windows-only


    1. naumenkoff
      07.08.2023 11:04

      Если целить в Windows-only с публикацией в MS Store, нужно было делать на UWP с крутым на мой взгляд WinUI)


  1. Fullspb
    07.08.2023 11:04

    Не лезу в тонкости (технические) создания проекта. Кое как поставил виджет погоды. Город по умолчанию "Homyel"

    Попробовал Saint-Petersburg. Рестартил сервис. Не помогло. По прежнему Хомель.

    Кстати откуда погоду тянет ? И поставьте уже ссылку на страницу скачивания виджетов. Прям в самом интерфейсе программы.

    Задумка хорошая. Спасибо


    1. IvanKucherov Автор
      07.08.2023 11:04

      Благодарю за ваш отзыв! Погоду тянет из https://open-meteo.com там можете найти название города как задано в API. Ссылку на страницу виджетов добавим.


  1. Grey83
    07.08.2023 11:04

    Ну что могу сказать? На Win7 SP1 x64 запустилось.
    Даже погоду показало.
    Только почему-то прозрачность фона виджета не меняется, а только насыщенность цвета (у виджета вообще прозрачность не работает: вместо фоновой картинки — чёрный прямоугольник).

    Пожалуй лучше продолжу пользоваться Rainmeter. Тем более, что за годы пользования я много виджетов переписал под себя, а то и сделал с нуля.

    И да: 600МБ ОЗУ (и 271ГБ виртуальной) для одного виджета — это вне добра и зла. Rainmeter у меня жрёт 32МБ (и 225МБ виртуальной) при этом используется 19 виджетов (примерно половина — дубли для размещения на втором мониторе).

    Скрин показаний Process Explorer'а


    1. IvanKucherov Автор
      07.08.2023 11:04

      Спасибо за ваш комментарий! На Windows 11 потребление ОЗУ составляет около 70мб. Большую часть ОЗУ потребляет Avalonia, а сами виджеты примерно 15мб, то есть вы можете использовать много виджетов и это сильно не скажется на потреблении оперативной памяти. А насчет прозрачности, работа Avalonia не заявлена на Windows 7, поэтому могут быть проблемы с отображением и ОЗУ.


    1. Vanirn
      07.08.2023 11:04
      -1

      Интересно какие причины попуждают сидеть на Windows 7?
      Ладно ещё Win8 была спорной, и 11 жрёт немного больше ресурсов и панель задач не передвинуть на лувую сторону, но почему не Windows 10?


      1. Grey83
        07.08.2023 11:04

        какие причины сидеть на Windows 7?
        А какие могут быть причины обновлять ОСь, когда меня полностью устраивает (и весь необходимый мне софт работает без проблем).
        Если хочу побаловаться чем-то посвежее, то без проблем всё это запускается на виртуалке. Пробовал когда-то поюзать 11-ю: фигня полная (местами красиво на тот момент выглядело, но на этом всё). Снёс и забыл.

        Если буду перебираться когда нибудь на свежую ось, то это скорей всего кубунта будет, а не плиточная винда.


  1. beskaravaev
    07.08.2023 11:04
    +1

    Хорошая работа, вы молодцы! Но есть придирка и вопрос:

    Больше похоже на статью из разряда "пиарюсь". На хабре хочется больше видеть технического, нежели "смотрите какой интересный проект".

    Название специально выбрано совпадающим с набором виджетов для андроид?


    1. IvanKucherov Автор
      07.08.2023 11:04

      Спасибо за отзыв! Название было выбрано не специально, незадолго до релиза только узнали что уже есть проект с таким названием.