Обновить
111.1

.NET *

Хаб со знаниями про .NET

Сначала показывать
Порог рейтинга

Определение типа fullscreen

Понадобилось мне как‑то определять тип fullscreen для вывода подходящего типа уведомления (звуковое/системное/окном) во время запущенных игр и родился такой код:

    public enum WindowFullscreenState
    {
        None,
        Emulated,
        Shared,
        Exclusive,
        ExclusiveGdi,
        NotOwned
    }

    public static WindowFullscreenState GetForegroundWindowFullscreenType()
    {
        var result = WindowFullscreenState.None;   
        uint dwProcessId;
        D3DKMT_QUERYVIDPNEXCLUSIVEOWNERSHIP query = new D3DKMT_QUERYVIDPNEXCLUSIVEOWNERSHIP
        {
            hWindow = GetForegroundWindow()
        };

        GetWindowThreadProcessId(query.hWindow, out dwProcessId);

        query.hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, false, dwProcessId);
        if (query.hProcess != IntPtr.Zero)
        {
            D3DKMTQueryVidPnExclusiveOwnership(ref query);
            CloseHandle(query.hProcess);

            result = query.OwnerType switch
            {
                D3DKMT_VIDPNSOURCEOWNER_TYPE.D3DKMT_VIDPNSOURCEOWNER_UNOWNED => WindowFullscreenState.NotOwned,
                D3DKMT_VIDPNSOURCEOWNER_TYPE.D3DKMT_VIDPNSOURCEOWNER_SHARED => WindowFullscreenState.Shared,
                D3DKMT_VIDPNSOURCEOWNER_TYPE.D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE => WindowFullscreenState.Exclusive,
                D3DKMT_VIDPNSOURCEOWNER_TYPE.D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVEGDI => WindowFullscreenState.ExclusiveGdi,
                D3DKMT_VIDPNSOURCEOWNER_TYPE.D3DKMT_VIDPNSOURCEOWNER_EMULATED => WindowFullscreenState.Emulated,
                _ =>WindowFullscreenState.None
            };
        }

        return result;
    }

    public enum D3DKMT_VIDPNSOURCEOWNER_TYPE
    {
        D3DKMT_VIDPNSOURCEOWNER_UNOWNED = 0,
        D3DKMT_VIDPNSOURCEOWNER_SHARED = 1,
        D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVE = 2,
        D3DKMT_VIDPNSOURCEOWNER_EXCLUSIVEGDI = 3,
        D3DKMT_VIDPNSOURCEOWNER_EMULATED = 4
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct LUID
    {
        public uint LowPart;
        public int HighPart;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct D3DKMT_QUERYVIDPNEXCLUSIVEOWNERSHIP
    {
        public IntPtr hProcess;
        public IntPtr hWindow;
        public uint VidPnSourceId;
        public LUID AdapterLuid;
        public D3DKMT_VIDPNSOURCEOWNER_TYPE OwnerType;
    }

    [DllImport("user32.dll", SetLastError = true)]
    private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool CloseHandle(IntPtr hObject);

    [DllImport("user32.dll", CharSet = CharSet.Unicode)]
    private static extern int MessageBoxW(IntPtr hWnd, string lpText, string lpCaption, uint uType);

    private const uint PROCESS_QUERY_LIMITED_INFORMATION = 0x1000;

    [DllImport("gdi32.dll", EntryPoint = "D3DKMTQueryVidPnExclusiveOwnership")]
    private static extern int D3DKMTQueryVidPnExclusiveOwnership(ref D3DKMT_QUERYVIDPNEXCLUSIVEOWNERSHIP data);
    
    [DllImport("user32.dll")]
    public static extern IntPtr GetForegroundWindow();

Схема использования с типами уведомлений:

WindowFullscreenState.Exclusive -> SendVoiceNotification
WindowFullscreenState.ExclusiveGdi -> SendVoiceNotification
WindowFullscreenState.Emulated -> ShowSystemNotification
WindowFullscreenState.Shared -> ShowSystemNotification
WindowFullscreenState.NotOwned || WindowFullscreenState.None -> IsForegroundWindowSmallerThanScreen ? ShowCustomWindow : ShowSystemNotification

Подробнее можно прочитать про виды захвата экрана тут и тут.

P.S. Некоторые игры (ExclusiveGdi) можно заставить (Emulated) получать системные уведомления через режим совместимости.

Теги:
+3
Комментарии0

.NET Digest #9

Рады вам представить девятый выпуск нашего дайджеста, посвящённого новостям и событиям в мире .NET!

В этот раз мы расскажем про новые preview и RC версии .NET 10 и новую Visual Studio 2026. А ещё мы собрали для вас несколько интересных статей:

  • про производительность в .NET от Стивена Тауба;

  • спонсорство на NuGet.org;

  • и статистику популярности языков от GitHub.

Команда PVS-Studio рада представить вам подборку самых интересных и полезных материалов! Подробнее читайте в нашей статье.

Теги:
+4
Комментарии0

Парсинг Сохранённых сообщений Телеграм в локальный каталог

Всем привет. Позвольте рассказать вам, как скачать содержимое Сохранённых сообщений Телеграм к себе на ПК.

Для начала, ознакомьтесь с предыдущей статьёй - Парсинг чатов Телеграм. В ней описан процесс установки и первичной настройки десктоп клиента. Кратко, что у вас должно быть настроено:
1. Путь к хранилищу (локальная БД SQLite).
2. Путь к файлу сессии (в нём сохраняется служебная текущая сессия подключения).
3. Регистрация приложения на сайте Телеграм.
4. Настройки подключения клиента (хранится в таблице приложений).

Страница настроек
Страница настроек

После успешного подключения к Телеграм, откроется доступ к меню Сохранённые сообщения. Заходим на третью вкладку Скачать, кликаем по кнопке Сбросить по-умолчанию, указываем локальный каталог на диске для скачивания файлов (например C:\OpenTgResearcher\SavedMessages). По необходимости, отредактируем первый ИД и количество потоков. Всё готово, кликаем по кнопке Запустить парсинг Телеграм. После чего можно идти пить кофе, пока ожидаем результат работы парсинга. Файлы будут скачаны в локальный каталог, а сообщения в соответствующую таблицу, их можно будет посмотреть на вкладке Содержимое.

Если вам нужна заказная разработка приложений либо вы в поисках разработчика моего уровня, сообщите пожалуйста мне в личку.

🧠 Стек технологий:
- Разработка ПО: Console, ASP.NET Core Web API, Blazor, WinForms, WPF, UWP, WinUI
- Хранение и передача информации: JSON, XML, SQLite
- БД и ORM: MS SQL Server / PostgreSQL / SQLite, EF Core
- Веб технологии: REST API / RESTful API, HTTP, TCP/IP, HttpClient, WebSocket
- Брокеры сообщений: RabbitMQ (готов быстро освоить Kafka)
- Контейнеризация: Docker / Compose (готов быстро освоить Kubernetes)
- Архитектура ПО: ООП, шаблоны проектирования (Design Patterns)
- Архитектурные подходы: TDD, DRY, KISS, SOLID, YAGNI, Clean Architecture, N-Tier Architecture
- Фронт: небольшой опыт разработки Angular

Теги:
+1
Комментарии4

Парсинг чатов Телеграм

Всем привет. Позвольте показать вам как скачать содержимое чата Телеграм к себе на ПК, включая сообщения.

Нам понадобится скачать программу OpenTgResearcher. Исходные коды лежат на ГитХаб. Комьюнити лицензию можно получить бесплатно в автоматическом режиме через меню программы. Скачать можно стабильный релиз, либо самую новую превью версию в разделе релизов. Есть несколько вариантов установки: консольная версия (кроссплатформенная), докер версия (для продвинутых), десктоп версия (под Windows).

Установим десктоп версию. Для этого нам понадобится дистрибутив. В списке файлов релиза найдите OpenTgResearcherDesktop‑win‑x64-Setup.exe (64-разрядная архитектура ПО). Браузер может запросить разрешение на скачивание и сохранение файла, а также предупредить, что файлы редко скачиваются. После чего, Windows предупредит вас, что файл скачан из интернета и спросит разрешение на установку. Для проверки дистрибутива на вирусы можете воспользоваться онлайн сервисом проверки VirusTotal. По завершении установки ПО вы должны увидеть загрузочную страницу. Из которой вы можете попасть на главную страницу.

Главная страница
Главная страница

Поздравляю, вы справились! Теперь необходимо настроить локальные каталоги. В главном меню слева выбираем Settings. В них вы можете задать путь к хранилищу (Storage: c:\OpenTgResearcher\TgStorage\TgStorage.db) и путь к файлу сессии(Session: C:\Users\<userName>\AppData\Local\OpenTgResearcherDesktop\current\OpenTgResearcher.session). После чего, сохраняем настройки и закрываем ПО, запускаем заново.

Итак, у нас есть локальное хранилище и путь к файлу сессии. Теперь нам необходимо получить авторизацию от самого Телеграм и сохранить сессию. Для этого, в главном меню слева открываем Client connection. Кликаем по ссылке my.telegram.org, в открывшейся странице браузера, вводим свой номер телефона, код авторизации получаем в боте Telegram Service Notifications. Далее, мы заполняем поля App title, Short name. Выписываем поля App api_id, App api_hash. Переходим обратно в OpenTgResearcher и заполняем поля API hash, API ID, Phone number. Эти данные сохранятся в локальном хранилище в таблице APPS. Если вы используете пароль, то заполните поле Password (это поле не сохраняется в таблице, если сессия протухнет, придётся вводить заново). После чего нажмите кнопку Connect to TG server. Возможно, к вам снова придёт код авторизации, в таком случае, его необходимо скопировать и вставить в поле Login code. После чего снова нажать Connect to TG server. В случае успеха — поле Connection state изменит своё положение на крайнее правое и описание рядом Client is connected, а также заполнятся остальные поля блока Settings without saving. В случае ошибок, смотрим содержимое поля Data request и запрашиваем помощь в Телеграм группе.

Что дальше? Просканируем доступные каналы и группы. Для этого в главном меню слева кликнем по меню Chats. Изначально список будет пуст. Заполним его, кликнув по кнопке Online update. Вы увидите прогресс парсинга ваших чатов. Сверху отображается текущий статус чтения, сколько чатов всего. Снизу отображается защитный механизм Телеграм — Flood Control. После определённой порции данных, Телеграм просит подождать несколько секунд, эта информация обновляется автоматически. По завершении парсинга, можно открыть любой чат, дважды кликнув по строке с именем. В открывшейся странице деталей чата настроим каталог для сохранения медиа (Directory). Если чат содержит темы, то можете включить переключатель Creating subdirectories. Если нам нужны комментарии - включите переключатель Parsing comments. Далее сохраним настройки — Save chat settings. Поздравляю, всё готово для скачивания — жмём кнопку Online update. Запустится процесс скачивания медиа и парсинга сообщений. В случае отмены — нажмите кнопку Stop download. Прогресс отображается в строках Message и Media.

Это мой первый пост на хабре. Оставляйте свои комментарии и пожелания.

Теги:
Всего голосов 2: ↑1 и ↓1+2
Комментарии8

В прошлую субботу я подал заявку на участие в митапе GoSharp Weekend, который проводит компания Ozon Tech. Все заявки на этот митап проходят модерацию, т.к. к участию допускаются только C#- и Go-разработчики уровня middle+.

Вчера я получил письмо с отказом:

Сначала я подумал, что просто закончились свободные места. Но сегодня я, как постоянный участник мероприятий Ozon Tech, получил письмо с рекламой данного мероприятия. Получается, что свободные места все еще есть, а моя заявку отклонили, потому что она не прошла модерацию. Вполне возможно, что из-за всей этой охоты на волков организаторы не поняли, что означает фраза «опенсорс-мейнтейнер», и приняли меня за накрутчика опыта.

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии1

Мне надоели платные приложения для учета расходов, поэтому я сделал свое: бесплатное и с открытым исходным кодом.

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

Я перепробовал десятки решений, но в каждом находил какие-то ограничения. Где-то были платные подписки или ограниченный функционал, где-то требовалась регистрация и данные о моих расходах улетали на сервера (зачем?), а где-то приложение просто не подходило мне по функционалу. В итоге я решил уйти от готовых приложений к учету в таблицах Excel. Но такой подход тоже был неудобным, и я понял, что пора создать свое собственное приложение: приватное, бесплатное и, самое главное, открытое.

В общем, так появилось Profitocracy - бесплатное Open Source мобильное приложение, написанное на .NET MAUI. Его главная цель — помочь пользователям организовать учет личных расходов по популярному правилу 50-30-20, а также обеспечить конфиденциальность данных. Profitocracy хранит всю информацию локально на вашем устройстве. Приложение не передает никакие данные третьим лицам и полностью свободно от рекламы и монетизации.

Среди основных особенностей приложения я хотел бы выделить:

  • Автоматическое планирование бюджета. Вы указываете дату окончания периода (получение зарплаты, например), и приложение расчитает для вас ежедневные расходы, расходы по типам (по правилу 50-30-20), а также по категориям (которые вы можете создать сами).

  • Индивидуальная настройка. Вы можете создавать собственные профили расходов: для личных нужд, на время отпуска или поездку в командировку. Причем столько сколько вам потребуется.

  • Приватность. Все данные - на вашем устройстве и только. Также, имеется возможность создания бэкапов (выгрузка данных в файл) для переноса данных на другое устройство.

  • Открытый исходный код. Исходный код проекта выложен на GitHub (ссылка на репозиторий). Каждый может внести свой вклад, предложить новый функционал или изучить как работает приложение.

  • Кроссплатформенность. Приложение доступно как для Android, так и для iOS.

  • Перевод на несколько языков. Profitocracy поддерживает русский, английский и другие языки.

На момент написания поста проект завоевал небольшой, но значимый отклик в сообществе разработчиков:

  • 100+ звезд на GitHub;

  • 20+ форков;

  • 3 активных контрибьютора. Причем, это не мои друзья :)

Ссылки на скачивание:

Буду рад вашим отзывам, предложениям и комментариям как на GitHub, так и здесь. Надеюсь, Profitocracy поможет вам так же, как оно помогло мне!

Теги:
Всего голосов 9: ↑9 и ↓0+14
Комментарии2

🎲 Обновление бота для планирования настолок и DnD

Привет! Я сделал телеграм-бота, который помогает быстро и удобно планировать игровые сессии с друзьями — будь то настолки, DnD или что-то ещё.

🎲 Обновление бота для планирования настолок и DnD
🎲 Обновление бота для планирования настолок и DnD

Идея проста:

  • создаёте группу в боте,

  • участники отмечают, когда они свободны,

  • бот показывает, в какое время совпадают все. Больше никаких бесконечных переписок в чатах, когда «мне удобно только в среду», а у кого-то уже пятница.

💡 Что нового в последнем обновлении Я выпустил большой апдейт, который особенно пригодится игрокам в настолки и DnD:

  • ⏳ Дата окончания сессии — теперь можно указать полный промежуток времени, когда вы свободны. Например, с 14:00 до 18:00.

  • 🔁 Повторяющиеся сессии — один раз указали «понедельник с 14 до 16», и эта запись будет актуальна каждую неделю.

  • 🔔 Настраиваемые уведомления — можно включать только те напоминания, что нужны, и отключать ненужные.

  • 🗓 Новое напоминание — за день до игры бот предупредит, чтобы вы точно не забыли.

📱 Если хотите попробовать — бот бесплатный, работает прямо в Telegram.
Ссылка на бота - @game_session_scheduler_bot
Ссылка на канал с обновлениями - https://t.me/gamescheduler

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

ChatCaster - приложение для голосового ввода с помощью геймада.

Друзья, всех приветсвтую!

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

Бонусом приложение поддерживает перевод на 5 языков (самые популярые в steam). Вы просто выбираете нужный вам язык, говорите на своем родном, весь текст будет переведен и введен там где вам нужно.

Если тут есть .net разработчики которые захотят присоединиться и доработать пару фишек или внести что-то свое, буду только благодарен.

Приложение делал один в рамках пет проекта, съело много времени, пока не могу себе позволить его развивать. Нужно дальше обучаться кодить и искать работу.

Короткое видео что оно умеет делать вот тут https://youtu.be/p_exJzcF1so

Ссылка на репозиторий если кто-то захочет поучаствовать https://github.com/KOMMEHTATOP/ChatCaster

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

Пост делаю впервые, АИ для текста не использую намеренно, готов к конструктивной критике или предложениям.

Буду рад если приложение окажется кому-то полезным.

Теги:
Всего голосов 3: ↑3 и ↓0+4
Комментарии0

Обновление бота: поддержка часовых поясов и улучшения стабильности!

Привет! Вышло крупное обновление бота, и вот что нового:

Ссылка на бота - @game_session_scheduler_bot
Ссылка на канал с обновлениями бота - https://t.me/gamescheduler

🕒 Поддержка часовых поясов
Теперь у каждой группы есть свой часовой пояс - по нему отправляются все уведомления.
У каждого пользователя - свой часовой пояс, и он видит все даты и время в привычном формате.
Это большое изменение, так что если что-то работает не так - обязательно напишите в канал или оставьте фидбек через бота.

Напоминание об оценке игроков
Через 2 часа после начала игры приходит уведомление: самое время оценить своих напарников!
Раньше об этом часто забывали, а теперь - точно не забудете.

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

🧹 Удалена настройка стандартного времени
Она только путала всех - больше этой настройки нет, и нотификаций по ней тоже.

Спасибо, что пользуетесь ботом!

Если возникнут вопросы - пишите в канал или через /feedback. Ваши отзывы помогают делать бота лучше ❤️

Теги:
Всего голосов 2: ↑1 и ↓1+2
Комментарии0

Спасибо за ваш фидбэк!

Благодаря вашим отзывам бот становится лучше с каждым днём.
Нас уже больше 250 - это очень вдохновляет! Вчера вышло обновление для бота и он стал чуточку удобнее.

Вот ссылка на бота - @game_session_scheduler_bot
А вот здесь канал с новостями и обновлениями - https://t.me/gamescheduler

Что нового в этом обновлении:

  • Можно настраивать стандартное время группы, это то за час до которого всегда идёт нотификации о сессии

  • Теперь можно добавлять игру прям во время записи на сессию

  • Больше никакого стандартного списка игр, всё нужно добавлять руками (только для новых групп)

  • Удалять время тоже теперь можно пачкой

Исправления:

  • Игра теперь должна быть уникальной только в рамках одной группы, а не всего бота

  • Исправлены несколько опечаток в русской версии

  • Добавлены кнопки возвращения в меню, внутри некоторых команд

  • Спам сообщением "Enter Command" в общие чаты должен прекратиться

Если захотите предложить новые фичи - пишите прямо в боте через фидбэк или в комментариях тут.

Спасибо, что вы с нами!

Теги:
Всего голосов 2: ↑1 и ↓1+2
Комментарии0

Контур проводит исследование о том, как живёт .NET-сообщество в России. Анкета активна до 15 июля.

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

Об итогах напишем на Хабре.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Ближайшие события

Научите, как пользоваться Хабром

К примеру, открыл я сайт. Увидел статью (оказалось пост)

Статья и Пост
Статья и Пост

Решил поставить комментарий под постом. Просит залогиниться. Жму залогиниться...

И всё, нет поста. Потерялся видимо в моих "рекомендациях". Необоснованные трудности для пользователя на пустом месте.

При этом пост не имеет простой ссылки открываемой кликом по заголовку или тип того

Решил вопрос, нажав - поделиться, скопировал. Залогинился. Вставил ссылку. Перешёл....

Мне кажется не такой должен быть пользовательский путь

Теги:
Всего голосов 8: ↑7 и ↓1+9
Комментарии3

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

Тут оверлей плеер https://github.com/maxim2d/Overlay_Player/releases

Тут второй проект https://habr.com/ru/posts/875106/

Дополнил скриншотами

Теги:
Всего голосов 1: ↑0 и ↓1-1
Комментарии1

В начале года я опубликовал статью про гибридное кэширование.

Гибридное кэширование в ASP.NET Core
В .NET 9 появилась новая библиотека для кэширования — HybridCache . В статье расскажу, что это такое...
habr.com

Прошло уже больше месяца, а стабильная версия nuget-пакета Microsoft.Extensions.Caching.Hybrid так и не вышла.

Я не делаю прогнозы по датам выхода, но хочу порассуждать на тему того, чего ожидаю от стабильной версии. И чего — точно нет.

Начну с последнего — каких изменений я не ожидаю

Изменение состава и сигнатур текущих методов. Если следить за выходом новых версий пакета Microsoft.Extensions.Caching.Hybrid, можно заметить, что методы объекта HybridCache не меняются уже давно. Из этого можно сделать вывод, что в стабильной версии мы увидим тоже самое, что наблюдаем сейчас.

Какие изменения я ожидаю увидеть

Удаление объекта из кэша по тегам. На момент написания статьи метод RemoveByTagAsync вообще не имел реализации. Сейчас в версии 9.2.0-preview.1.25105.6 он реализован и вполне себе работает, так что в релизную версию явно войдёт.

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

  await cache.GetOrCreateAsync(
    "someKey",
    async ct => await SomeFuncAsync("someKey", ct),
    options,
    ["tag1", "tag2", "tag3"],
    cancellationToken);

  await cache.GetOrCreateAsync(
    "someKey",
    async ct => await SomeFuncAsync("someKey", ct),
    options,
    ["tag1", "tag4"],
    cancellationToken);

Представим, что метод GetOrCreateAsync вызывается несколько раз с одним и тем же ключом, но разным набором тегов. Теги будут присвоены только при первом попадании объекта в кэш, то есть в момент его извлечения из хранилища. Когда проектируем приложение, не всегда заранее известно, в какой из вызовов GetOrCreateAsync объект будет извлекаться из кэша, а в какой — из хранилища. Оно и логично — метод специально создали так, чтобы мы не задумывались об этом. Соответственно, сейчас при вызове этого метода мы не можем определить, какой из наборов тегов ляжет в кэш.

И тут у меня два варианта развития событий: или логика поменяется и теги будут перезаписываться всегда — независимо от того, берётся объект из кэша или хранилища. Или при написании программы нужно будет следить, не передаём ли мы разные наборы тегов.

Теги:
Всего голосов 3: ↑2 и ↓1+3
Комментарии0

Библиотека Eremex Avalonia Controls - Поддержка macOS

Как известно, Avalonia UI - кросс-платформенный фреймворк. Но признаемся честно, при разработке приложений под разные платформы иногда возникают разного рода "проблемы".

Когда создавалась библиотека контролов для Avalonia UI, нам пришлось решать ряд таких "проблем", воспроизводящихся на отдельных операционных системах.

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

  • Наладили работу MxWindow и плавающих окошек в Docking UI.

  • Graphics3DControl теперь успешно показывает 3D-графику. Сделали более информативные сообщения в случае, если драйвер графической карты не поддерживает Vulkan SDK.

  • Сделали более плавным механизм зумирования в чартах.

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

Предыдущая публикация: Библиотека EremexControls.NET для Avalonia UI - Большое обновление

Демо-приложение

Наше демо-приложение позволяет познакомиться с кросс-платформенной библиотекой EMX Controls для Avalonia UI поближе.

https://github.com/Eremex/controls-demo

Наши контакты

Официальный сайт: https://www.eremexcontrols.ru/, https://www.eremexcontrols.com/

Телеграм-каналы: https://t.me/+0-7rYS4lgo82ZTZi  (русский), https://t.me/+ueFmwPNHidE0NDUy (английский)

Документация: https://eremexcontrols.net/

Теги:
Всего голосов 6: ↑6 и ↓0+6
Комментарии0

Дорогие разработчики, как вы относитесь к работе в стартапах?

Если был опыт работы в них, то на каких условиях вы соглашались работать? Процент от компании или зп? Может и то и другое?

Я делаю стартап и ищу разработчиков в команду, поэтому хочу узнать какие условия могли бы быть интересными для вас

Было бы шикарно, если бы кто-нибудь смог проконсультировать по разработке

Теги:
Рейтинг0
Комментарии8

Помните надоевшую проблему в Visual Studio, когда хочешь скопировать текст ошибки, но копируется вся строка целиком с кучей ненужного для гугления мусора? Даже расширения есть, которые это фиксили. Так вот, забудьте об этой проблеме! Вчерашнее обновление VS 2022 решило и эту проблему тоже. С полным списком исправлений можно ознакомиться здесь

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

C# разработка и статический анализ: в чем практическая польза?

Многие C# разработчики знают, что статический анализатор кода — это полезная штука (или крутой инструмент?). Но какие проблемы он может выявить в реальности?

  • Заметит незакрытую скобку?

  • Укажет на плохое название или проблемы с код-стайлом?

  • Выявит NRE или выход за границы массива?

  • Или же он способен на что-то большее?

Узнаем в новом вебинаре, посвященном использованию статических анализаторов для проверки и улучшения C# проектов. Узнаем возможности инструмента на реальных примерах, его сильные и слабые стороны. А ещё разберём тему безопасной разработки, узнаем, способны ли выявлять анализаторы уязвимости и причём тут новый ГОСТ 71207.

18 ноября 14:00

Ссылка на регистрацию здесь.

Присоединяйтесь! Будем рады пообщаться!

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0
1

Вклад авторов