ХаритоновСофт
51 subscribers
29 photos
1 video
10 files
103 links
Download Telegram
Статистика и проникновение Индикатор в мир

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

Там же, выводится гистограмма по Индикатору. Каждый день представлен четырьмя столбиками: сколько раз приложение было скачано, сколько раз триальные копии вышли на связь, аналогичная цифра по зарегистрированным и количество покупок.

Недавно проснулся, а у меня за день 500+ скачиваний, это аномалия, обычно меньше 20ти. Пошёл смотреть, оказалось какой-то умелец с немецкого хостинга поставил скачивание файла или проверку его даты создания (это один и тот же запрос), на _каждую_ минуту. Я привык к тому, что боты некоторых софтверных порталов ставят чекеры на случай обновления, чтобы побыстрей скачать новую версию, начинить её троянами и выложить бесплатно. Но чтобы каждую минуту, это он явно погорячился, я с таким рвением новые релизы не делаю. 😊

Смотреть статистику — это отдельный вид удовольствия. Можно узнать из какой страны кулхацкер ломает программку, это видно по изменённому содержимому исполняемого файла. Видел запросы из Тайланда и Алжира. Но самая активная, ломанная версия, приходит с Родины, в зарегистрированном на IP адресе, стоит Верхняя Пышма, Ленина, 1 😂

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

Вот такие образчики маркетинговой мысли там можно прочесть:
«В постоянно развивающемся мире инструментов повышения производительности «Индикатор раскладки» от Kharitonov Soft выделяется как выдающаяся утилита, предназначенная для оптимизации процесса набора текста.» 🔥🔥

Запишу себе в резюме, что являюсь автором выдающейся утилиты для повышения производительности. 💪
👍8😁1
Первый! Ниша занята 💪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍3
This media is not supported in your browser
VIEW IN TELEGRAM
В далёком, 2021, я выкатываю фичу, позволяющую выполнять любую команду, при переключении на каждую раскладку.

В 2025, находится человек, её применивший. 💪

https://www.youtube.com/watch?v=26XHb_cpiAA — инструкция для желающих повторить.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍1😁1
3.0.3 — тестовая

Накопилась кучка неприятных багуль по Индикатору.
Были безжалостно повержены.

Так же сделал дополнительную вкладку на форме настроек «Dev».
Там будет собираться всякая краткая диагностика с удобной кнопкой для копирования в буфер.
Даже подумал сделать автоматическую отправку в телегу, но побоялся дудоса)

В арихве, по старинке, один exe-файл. Для желающих потестировать, просто заменить.

Напоминаю, что нужно сделать, чтобы не пришлось регистрировать программу заново:

1. Переходим в «Расширенные настройки» (правый клик на иконке программы в систрее).
2. Ставим напротив пункта «Сохранять регистрационные данные в файл настроек» значение «True».
3. Сохраняем настройки в файл LayoutIndicator.json, в каталог где лежит программа.

Список изменений

Добавлена вкладка с информацией о текущем состоянии программы для удобной диагностики ошибок
🛠 (исправление) При загрузке команд, запускающихся при переключении языка, из файла настроек, пути обрабатывались неверно
🛠 (исправление) Некорректное отображение некоторых элементов UI при масштабировании
🛠 (исправление) Не работала сортировка раскладок в последней версии Win 11
🛠 (исправление) Опечатки в английской версии перевода

https://khsoft.ru/download/test/LayoutIndicator.v3.0.3.test.zip
👍3
This media is not supported in your browser
VIEW IN TELEGRAM
3.0.4 — тестовая

Небольшие доработки и исправления, перед тем как зазесть за главную беду — поиск нового способа получить текущую раскладку в винде.
Вернул кнопкам цвет, добавил инфы в диагностику. Заодно сделал перемещение индикатора каретки мышью, теперь можно быстро убрать, если мешает.


Список изменений

Индикатор каретки теперь можно перемещать мышкой
Добавлена информация об экранах на вкладке диагностики
🛠 (исправление) Кнопки выбора цвета не красились в выбранный цвет

https://khsoft.ru/download/test/LayoutIndicator.v3.0.4.test.zip
👍3🔥1
Добрался до Индикатора — давно чесались руки. Несколько лет назад, практически пропала возможность отладки проекта. Из-за сложности общения потоков между собой, дебагер вылетал, заявляя, что лезть к объекту из треда, в котором он не был создан — моветон. Когда совсем прижимало, находил обходные пути, но хотелось простого, человеческого дебага с которым можно двигаться в разы быстрее.

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

Разводить глубокий ресёрч настроения не было, попробовал примерно три решения от GPT, остановился на реализации через таймер, работающий в главном UI-потоке. Довольно быстро отрефачил костяк приложения. Конечно же, появились лютые багули: созданные в родном потоке окна, внезапно начали перехватывать фокус при показе, всё это вгоняло поток в рекурсивную петлю, когда появлялся тестовый индикатор каретки. Но теперь у меня есть отладка! Огромная экономия времени.

И всё это ещё в Ридере, IDE для дотнета от брейнсов. На работе пишу js и groovy в IDEA, пхп и js пэты ковыряю на phpStorm, иногда захожу в DataGrip, короче я плотно сижу на идэехах от брейнсов. Каждый раз когда писал на VS, испытывал подгаралити. А тут как рыба в воде. Придётся теперь и на виртуалку его ставить, назад не вернусь, точно.

На радостях заредизайнил UI вкладки. С особым удовольствием прибрал вкладку мышиных индикаторов — там был свальных грех, стало почище. Тестовую версию не делал, пока всё очень сыро.
👍8
Утонул в проекте. Добрался до 30го уровня сумрака, но вынырнул и собрал тестовую версию.

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

Ниже, кратко, что получилось, а в следующим постом — полноценный девлог.


Изменения

Алгоритм поиска раскладки по системному индикатору стал эффективней и стабильнее
Упростилось и ускорилось создание диагностической информации, для случаев когда не был найден системный индикатор Windows
Прекратилась поддержка нескольких раскладок для одного языка, при определении по системному индикатору, в некоторых версиях Windows 10
Переработан UI
Экранные индикаторы стали меньше мигать при переключениях
🛠 (исправление) При стандартном способе определения раскладки не распознавались разные раскладки одного языка
🛠 (исправления) При отключении отображения флагов, программа переставала работать до перезагрузки.

https://khsoft.ru/download/test/LayoutIndicatorSetup.v3.0.6.test.zip
🔥2👍1
Начал с того, что продолжил переходить на однопоточную модель. Очень понравилось полноценно дебажить. Гораздо быстрее чем вдумчиво смотреть на логи. Тем кто не смотрел на логи Индикатора, стоит ради интереса врубить как-нибудь галку «Писать лог-файл» и удивиться, сколько работы идёт под капотом. Уже давно несмотрю их в лоб. Каждый модуль имеет свой тэг, по нему и фильтрую. Помогает линуксовый серверный опыт, "tail -f LayoutIndicator.log | grep CaretIndicator" и вот уже в реальном времени можно дивиться удивительной жизнью индикатора каретки. Кто ещё не использует линуксовые утилиты в Windows, люто рекомендую.

Прелопатив основную часть, запустил новую версию на своих настройках и словил жуткие фризы, всё залипало и еле двигалось. Оказалось, из-за поддержки клавиатур Corsair. Попытки подключится к ним, жили в отдельном потоке. Немного помучив нейронку вопросами как бы дождаться подключения и UI не зафризить, по старинке написал колбэк, хоть и очень не хотелось специально для этого менять код.

Достал из сусеков клавиатуру и затестил, всё мигает как раньше, ничего не виснет, во всех кейсах. Там своя атмосфера. Стандартная библиотека реализует работу не с самой клавиатурой а с API сервера для устройств Corsair. Поэтому, много чего может не быть. Сервера, подключения к серверу, подключения клавиатуры к серверу. Не так-то просто мигать подсветкой кнопочек.

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

Победив подвисания, начал жить на новой версии и сразу заметил, что индикация чуть запаздывает. Какие-то жалкие миллисекунды, работать можно, но раздражает страшно. Тут же попробовал прошлую версию, подтвердил, что дело в однопотоке. Покопался в обработке очереди на таймер — не помогло. Откатываться на мультитред — не вариант. Пришла идея сделать переключатель планировщика задач из однопоточного режима в многопоточный, таким образом, чтобы не менять код добавления задач. Довольно легко запилил, задержка ушла. Задав командой препроцессора #if DEBUG переключение в сингл-режим, я получил и отладку и скорость прошлых версий. Вот это я называю вин-вин.

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

Дойдя до логического конца с этим режимом, занялся проблемой с которой чаще всего обращались в последнее время — определение раскладки по системному индикатору. Он мистическим образом пропадал с радаров, а где-то и вовсе не находился в известных местах.

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

ИИ не обрадовал. Единственный новый способ, который он выдал, внутри, опирался на старый добрый вызов winapi, это первое, что предлагают бедолагам, решившим программно получить текущую раскладку. Но! В дебрях его решения был один нюанс, который не сразу бросился в глаза, а при проверке оказалось, позволяет решить проблему получения разных раскладок внутри одного языка, если способ определения — не системный индикатор.

Без понятия сколько людей на земле используют разные раскладки одного языка. И сколько из них не работают в консольных и UWP-приложениях, чтобы можно было отрубить определялку по системному индикатору. Но на их улице сегодня праздник. Жители ликуют. Боже, чем я занимаюсь... (Смеюсь).

У меня был коварный план — посмотреть предложения от нейронки а потом покапать уже целенаправленно, туда где мне грезилось универсальное решение. Но об этом в следующей заметке сумасшедшего.
👍2
«А что, если получить доступ к памяти индикатора Windows?» — подумал как-то я. Отладчики же умеют, чем мы хуже? Подцепимся к процессу, сдампим память, покопаемся в байтиках. Понимаю, звучит утопически, но вдруг. Выслушав грязные подробности об архитектуре индикации языка, да, там целая архитектура, вкрадчиво поинтересовался у ИИ: «а вот если, допустим, один мой друг, хочет вскрыть память индикации винды и всё от туда узнать про текущую раскладку. Как ему это сделать? Спрашиваю не для себя, сам таким не занимаюсь, конечно же».

Ответ меня обрадовал. Говорит: «вот тебе код, получай дамп, ищи вот эти байты, оно и есть ID раскладки». Заранее радовался не сильно, т.к. опытный заклинатель ИИ. Получив первые дампы для разных раскладок и обнаружив их абсолютную идентичность, спросил, с праведным гневом, где же мой ID раскладки? А там всё по классике: «Да он там вообще не бывает, с чего ты решил тут искать, что, я посоветовал? Извини, бес попутал, то, что тебе нужно вообще невозможно. Хочешь адрес ближайшей психологической помощи, скажи, я напишу».

Сохранив наработочки для будущих обострений, идею отложил.

Как не удивительно, но единственный, более-менее простой, способ, программно узнать текущую раскладку ввода в Windows, во всех классах приложений — воспользоваться технологией, созданной для слепых. Благодаря таким людям, мы можем программно считать с экрана называние языка. На дворе 2025й. Но и тут не всё так просто. Разработчикам майкрософт не занимать творческой энергии и бОльшая её часть расходуются, на перемещение индикатора раскладки внутри компонентов панели задач. Сам лично видел пять-шесть вариантов в разных версиях, плюс пользователи присылали интересные логи.

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

Тут сразу несколько минусов. Во-первых всё это генерировалось довольно долго, сделать видимость процесса поленился, поэтому нужно было подождать, найти файл и отправить его. За всё время существования такой возможности, прошёл этот квест всего один человек, за что ему огромное спасибо.

Конечно, можно было автоматически кинуть инфу на какой-нибудь из своих серверов, но это чистой воды троян. Утечь могло всё что угодно, включая чувствительные данные. Мы такое не делаем.

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

Поэтому, было принято радикальное решение — снести к чертям все эти городульки и сделать божественно простой алгоритм поиска родного индикатора языка. Поделюсь им с вами: берём дерево элементов таскбара с основного монитора (на нём живёт индикатор), с глубиной потомков 3 (хватает 2, ещё одно поколение заложил на будущее), ищем первый элемент, текст с которого совпадёт с названием любой из раскладок, установленных в системе. Всё.

Ладно, не совсем всё, для некоторых версий десятой Windows, невозможно получить полный текст подсказки элемента, если в нём присутствуют переводы строк (обожаю IT!). Так что за простоту мы заплатили деградацией функционала: на особых версиях десятки, будут неправильно определяться разные раскладки одного языка. Такова жизнь.

Поэтому искать пришлось не только по имени раскладки но и по языку, если по имени не получилось. Закончилось всё хорошо, стабильно нахожу нужный элемент, в всех доступных мне версиях.
🔥2🤯1
Дальше был классический реалити-чек. Элемент есть, а текст его считывается не всегда, примерно, один раз из ста может не считаться, плюс минус двести обращений, это не точно, зависит от частоты попыток, но не всегда. Что ты пристал, скажи спасибо, что он с экрана не пропадает. Хотя, может и пропадает, просто мы не видим — очень быстро восстанавливается, по сверхбыстрому таймеру. Вообще не удивлюсь, если это так.

Отлавливаю эти провалы в логах и вижу рейскондишн, это когда потоки начинают глючить из-за одновременного доступа к общим частям кода. Ставлю лок-блок, это когда ты помечаешь место которое должно выполняться одним потоком, в один момент времени, остальные ждут своей очереди. И чтобы вы думали? Рейскондишн сохраняется. Иду к GPT, он объясняет, что свой код ты конечно обезопасил, молодец, но вот этот вот AutomationElement который ты дёргаешь, он вообще сделан нот сафети мультитред, да и пропадает часто, нет ему никакой веры! И вообще, они когда эту штуку для слабовидящих делали, ни про какую многопоточность не думали.

На опыте делаю сигнл-тред планировщик и оборачиваю им получение элемента. Проблема параллельного кода ушла. Ура. Теперь элемент не отдавал текст уже в одном потоке, изредка. Пришлось всю эту конструкцию украсить повторением проверки. Не получилось с первого раза? Не беда, попробуем ещё раз. И ещё. И только если три раза не вышло, генерим файл с нашим небольшим деревом (на моём таскбаре — 150 строк), в котором минимум информации, только необходимое и слёзно просим прислать. Благо такое можно и мессенжере кинуть.

Попутно разрулил старый баг, который то пропадал то возвращался. Помогло общение с ИИ. Часто менял тред в котором работаю с UI, но уже постфактум, когда всплывали ошибки. А тут он мне популярно объяснил: есть UI-поток, и всё, что касается интерфейса, нужно делать в нём. Красить, менять, скрывать, показывать, просто перемещать, всё в нём. Преисполнившись этим знанием переписал пару мест, багули рассосались.

Как же я долго программировал... Ещё одна прохладная история в следующем посте и спать.
3
Во время всей этой вакханалии, мне захотелось запустить Индикатор на чистой винде. Для этого пришлось реанимировать VirtualBox. Я давно перешёл на VMWare, он пошустрее, писал прямо там, но в бесплатной версии не дают делать точки восстановления. Сейчас кстати, подумал, что их можно было делать в самой винде, на виртуалке.

Вибокс был такой старый, что там почему-то была прописана несуществующая сетевая карта, поменять которую конечно же просто так нельзя. Я говорил вам что обожаю IT? Под это дело решил обновиться. При установке драйвера USB-монитора, входящего в комплект бокса, Windows потушила два монитора из четырёх и повисла намертво. Обожаю перезагружаться. Дальше ушло какое-то время, чтобы вспомнить — на вибоксе не будет интернета по не установишь гостевые приблуды. Этим он отличается от vmware, поэтому забыл. Хорошо хоть помню, что без этих гостевых штук нельзя подрубить директорию с хоста, пару раз тупил с этим.

Вжух! И у меня чистая винда с пошареной папкой хоста и точкой восстановления. Запускаю программу. В ответ тишина, и даже логов нет. Процесс помирает. Такое поведение сделано для кулхацкеров которые решили обойти мою мега-защиту и кинуть инди-разработчика на бабки. Но это дев-версия, тут ничего такого быть не может. Или может? Диагностика без логов, ммм, заверните две. Оказалось, что ошибка в таком месте, что система логирования ещё не готова там работать, тут моя вина, признаю.

Вляпав старый добрый MessageBox.Show узнаю, что не может загрузиться библиотека для работы со звуком. Всю жизнь работала, а тут вдруг не может. Специально вшил её dll в ресурсы и копирую, самостоятельно. Нет говорят, либо разрядность не та, либо ты не все её dll, от которых она зависит, скопировал. Если работает на другой машине, значит с разрядностью всё ок. Иду в исходники либы и копирую все dll. Ошибка сохраняется. Мне предлагают посмотреть зависимости через специальный софт. С удивлением узнаю, что зависимостей дохрена, как же это работало?

Вообще, в проекте, стоит пакет Costura.Fody который как раз вшивает все зависимости в exe-файл. Но я же недавно перешёл на Rider с VS, может он перестал работать? Сношу, генерю exe, ставлю заново, генерю. Экзешник пухнет, пакет явно работает. Начинаю копать и узнаю, что Fody занимается только .net-зависимостями, всё остальное, будь добр подтяни сам.

Так мне открылась страшная правда — с того момента как в Индикаторе появилась поддержка звука, люди без установленного пакета «Visual C++ Redistributable for Visual Studio 2015–2022», запуская мою программу, не получали ничего кроме разочарования. Ни тебе сообщения об ошибке, ни каких-либо сигналов. Процесс просто умирал. Зная, что редкий юзер будет слать репорты в таких случаях, могу предположить, что было какое-то количество людей, которые просто забили и пошли жить дальше. А может и нет, этот пакет требуется много где, поэтому так долго не видел ошибку. Мы никогда не узнаем.

Требовать установку пакета не стал, получил список недостающих dll и вшил их в exe, руками. Пишу эти строки и понимаю, что официальный релиз лежит с этой багулей, прямо сейчас. Что ж, будет повод не затягивать с новой версией. Такой ценой был приобретён опыт.

У меня всё. Спасибо за внимание.
🔥4👍21
Добрался до релиз-кандидата. Замораживаю для новых фич, правлю багули.

Переход с VisualCode на Rider оказался прорывным. Поработал с профилировщиком, очень достойно. Это такая штука, которая показывает, как и где твоё приложение расходует ресурсы.

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

Поиск координат каретки в Windows — отдельный вид извращения. Есть два известных способа. Первый, быстрый и лёгкий, мгновенно выдаёт результат, но работает не везде. Второй тяжёлый и сложный, может сработать там, где первый не справился. Работает ли он везде? Конечно же нет. Очень много приложений не отдают информацию о своей каретке, не знаю почему, может сами её рисуют, в обход системных средств.

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

И можно забить, если бы не потребление ресурсов. Максимально универсальным, этот метод делал самостоятельно, просто копаясь в дебрях ОС. Получился такой алгоритм:
1. Берём процесс активного окна. Тут можно кэшировать. Первый раз запоминаем у какого окна какой процесс, все последующие обращения идут в память.
2. Начинаем перебирать все треды процесса. Потому-что получить координаты вторым способом можно только из тредов. А их может быть овердофига. Практика показала, что можно смотреть первые 10, этого достаточно для большинства случаев.

Процессору это тяжело, особенно если каждый раз ничего не находится.

Начал ещё раз копать эту тему и почти сразу обнаружил, что искать имеет смысл только в GUI-потоке, о существовании которого узнал недавно. Это так логично: если для операций с интерфейсом есть специальный поток, то и каретку нужно искать в нём. Имеется специальный метод, чтобы его получить. Плюс он кэшируемый, менять GUI-поток — лютая экзотика, которой можно пренебречь.

Переписал, проверил, нагрузка ушла, полегчало значительно. Сколько же лишних тактов моё детище сожрало по всему миру? Иран, Венгрия, Россия-матушка... пожрал электричество почём зря. Такова цена опыта.

Ещё, в арсенале для разработки Индикатора, есть стресс-тест: цикл на 4000 операций. В каждой запрашиваем раскладку и мигаем всеми индикаторами. Давно не пускал, а тут удача — удалось воспроизвести очень редкий баг с переполнением GDI объектов. Оказалось, при смене иконки приложения в системном лотке, нужно обязательно вызывать метод ОС для чистки памяти. Поправил.

В процессе изменений, поймал ошибку — не все индикаторы совпадали. Например, на экране одна раскладка, возле курсора другая. У этого явления интересная природа, причина которой опять упирается в нестабильность методов ОС. Есть стандартный способ подписаться на событие «смена языка ввода», угадайте, работает ли это всегда и везде?

Поэтому приходится полагаться на целую группу событий, если хоть одно произошло, возможно, сменится раскладка. Мой минимальный список:
1. Нажатие клавиш. Тут всё понятно, просто переключили язык, аль-табнулись в приложение, где он другой.
2. Клик. Могут выбрать язык через системный индикатор, либо переключить приложение.
3. Переключение приложений. Это может случится без нажатия на клавиши и кликов. Например, всплытие модального окна или тупо перехват фокуса.
👍2🔥1🤯1
Если проверять раскладку после этих событий, вы гарантировано отловите момент переключения. Можно разгрузить систему и поставить проверку только по клавишам – есть в настройках, сам использую такой способ.
И всё было бы просто, если не один нюанс — переключение раскладки не мгновенная операция. Если вы кликнете в системном индикаторе на новый язык, то в обработчике клика, он будет старым, проверять нужно, примерно, через 100 миллисекунд. Тайминги зависят от нагрузки и конфигурации компьютера.

Вот и получается, что где-то изменение не обработалось, показали не то, а новая проверка не сгенерирует событие «язык поменяли», он такой же.

Хорошая новость — такое решается архитектурно. Каждому индикатору положил внутрь объект «состояние индикации», теперь все они знают, какое состояние показали последний раз. Синхронизация упростилась. Теперь если и лажанёмся, то все вместе 😁.

Так же было замечено, что не все звуки для переключения раскладки работали. Оказалось, звуковой библиотеке не нравятся некоторые параметры сэмплов. Быстро перекодировал и исправил, благо их было всего три. Пока возился, услышал неприятный щелчок в конце уханья совы. На спектрограмме его не было видно. Дело оказалось в каких-то фреймах и прочей мути аудиокодирования, спасибо ИИ, подсказала, что можно залечить небольшим фейдом. Самое главное исправление в этой версии — убран неприятный щелчок в звуке для переключения «Сова» 😁.

Изменения в 3.0.7
Добавлена кнопка настройки языков Windows (вкладка Dev)
Улучшены алгоритмы индикации и синхронизации раскладок
В taskbar_tree.json добавлены установленные раскладки
Переработаны алгоритмы, отвечающие за индикацию раскладок
🛠 (исправление) Исправлена ошибка GDI+
🛠 (исправление) Снижена нагрузка на CPU при поиске каретки
🛠 (исправление) Исправлены параметры аудиофайлов (не все звуки проигрывались)
🛠 (исправление) Убран щелчок в конце звука «Сова»

Индикатор 3.0.7
https://khsoft.ru/download/test/LayoutIndicatorSetup.v3.0.7.test.zip
8
Релиз Индикатора. Версия 3.0.8

Спасибо всем, кто качал тестовую сборку. Сам тоже проверил, до чего успел добрался.
Отправляю в свободное плавание. По статистике сайта, кучка роботов проверяет номер версии каждый день. После релиза всегда всплеск скачиваний. Мне представляется группа людей, качающих Индикатор, приговаривая: «ну что, может хоть в этой версии он всё починил» 😁.
Получилось довольно плотное обновление. Доволен. Но это пока не полетели баг-репорты 😁 — бывали у меня релизы-провалы.

Если у вас уже стоит 3.0.7 (тестовая), можете не спешить с обновлением: основные отличия — в доработке интерфейса, было криво при масштабировании, в паре мест.

Из 25 изменений, ИИ выделил 6 самых значимых:

* Обновлён пользовательский интерфейс
* Индикатор положения каретки теперь можно перемещать с помощью мыши
* Улучшен алгоритм определения раскладки по системному индикатору — стал быстрее и надёжнее
* Повышена точность индикации и синхронизации языковых раскладок
* Оптимизирован поиск каретки — снижена нагрузка на процессор
* Исправлен сбой при отключении отображения флагов — работа программы больше не прерывается

Сайт программы: https://khsoft.ru/li

Всем чёткой индикации!
6
По наводке из чата, добавил индикатор на alternativeto.net
Не знал о существовании этого сайта, а он оказался полезным.
Нашёл пару неизвестных мне программ, может что-то войдёт в будничный инструментарий.

Буду благодарен если лайкните или свяжите с другим софтом. Там очень разнообразно можно помочь приложению.
Кулхацкеры взялись ломать свежий релиз 😁
На пенсии, можно будет написать для таких случаев специальную версию 👹
👍2😁1
Делал недавно спецверсию Индикатора — без требования админских прав. Уже не помню, что стало первой причиной, по которой пришлось повышать права, но потом, без них, Windows просто не отдавала координаты мыши, если приложение запущено под админом, а Индикатор нет.

Это было забавно, получить нажатые клавиши, из админского приложения, можно, а координаты мыши ни-ни, они же важнее 🤭. Что, приложение с правами юзера может смотреть, что напечатали в админском? Но зато никто не узнает, какие там были траектории мыши!

При сборке в Rider заметил: всё работает и без прав. Посмотрел мышиный индикатор — работает! То ли Rider как-то влияет, то ли Windows поменялась, проверять глубже лень.

А тут пользователь попросил спецверсию под последний релиз. Пошёл разбираться — оказалось, права требовал не сам Индикатор, а установщик, который я изначально так настроил. Чтобы сразу дать понять — права нужны и без них ничего не получится. В противном случае, можно было прокликать установку и в конце получить квест на чистку компьютера от бесполезного мусора.

Поменял дистрибутив. Теперь, по умолчанию, скачивается версия без прав администратора. Самый худший исход такого решения — отказ работы мышиного индикатора в приложениях, запущенных под админом, в старых версиях Windows.
🔥3👍1
Первая, послерелизная, жатва собрана. Как всегда много нового и удивительного. За время разработки Индикатора, узнал столько, что пользуйся я им в одно лицо, даже и помыслить бы не смог, что такое бывает.

Открытие первое — существует целый класс программ, которые подменяют стандартные UI Windows. Не просто рейстайлят их, прикручивая свистоперделки, а прямо заменяют на свои, чтобы ничего не ограничивало свободу творчества. Понимаю и одобряю. Тут мне помог новый подход обработки системного индикатора. Не полагаться на место элемента в иерархии и его параметры — было правильным решением. И всё бы заработало, если бы не смена элемента. Оказалось, при работе таких программ, нельзя кэшировать индикатор, нужно каждый раз его находить. Благо это не так затратно.

А кэшировать нельзя, потому что происходит какая-то чёрная магия — они связывают свои элементы с родными, через особый механизм, при этом мой объект, связанный с системным, до них, перестаёт быть валидным, но остаётся живым. Мрак.

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

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

Открытие второе — настойчивая перерисовка некоторых индикаторов нужна. После введения состояний, таскбары начали красится только когда меняется раскладка. Но, похоже, их нужно перекрашивать по таймеру, т.к. все норовят их перекрыть. Буду надеяться, что это поможет.

На альтернативо никто даже лайка не поставил! Поддержите независимого разработчика лайком, что вам стоит?

Изменения (3.1.0)

🛠 (исправление) Добавил поддержку индикаторов таскбара, они пропадали
🛠 (исправление) Не считывалось состояние системного индикатора, если были запущены программы, подменяющие стандартные компоненты Windows

https://khsoft.ru/download/test/LayoutIndicator.v3.1.0.test.zip
👍6