Индикация звуком
Не думал об озвучивании нажатий клавиш для разных раскладок. Давно печатаю в слепую на обоих языках и сразу вижу, если начал не на том, плюс цвет панели и флажки помогают.
Когда Владимир написал эту идею, просто добавил в список, где лежат все задумки. Потом вспомнил как один коллега, которому я посоветовал поставить Индикатор, сказал, что он при печати не смотрит на экран, поэтому моё приложение не поможет. И вообще, стали часто попадаться на глаза люди, печатающие не на том языке, уткнувшись в клавиатуру. Так, потихоньку, эта идея становилась всё более привлекательной. Да и если бы я добавлял в программу только то, что нужно лично мне, она бы замерла примерно на версии 1.1 😊
К пожеланиям Владимира присоединился Oleg, с тезисом, что озвучивать каждое нажатие — это перебор, нужно отключать звук после какого-то времени с момента переключения либо после определённого количества символов.
Такое ТЗ легло в основу доработки. Благо теперь настройки для каждой раскладки на отдельной форме, просто добавил вкладку «🎶 Звуки». Сообразил, что в названия можно добавлять иконки юникода и добавил их, между делом, для всех вкладок.
У раскладки есть два события которые можно озвучить:
1. Переключение на неё
2. Нажатие клавиши, когда она активна
Встроил небольшую библиотеку звуков для обоих случаев. Рядом с выпадающем списком можно настроить громкость и послушать как они будут звучать.
С первым пунктом всё понятно, а вот озвучка нажатий может быть настроена более тонко. Выключаться по прошествую времени или набору определённого количества символов. И включаться обратно, если долго ничего не печатали.
Моё погружение в мир работы со звуком в .Net это история, заслуживающая отдельного поста. Там был весь спектр эмоций. 😊
Библиотека, позволяющая всё это делать, почему-то не хочет встраиваться в исполняемый файл, поэтому она пока будет появляться в директории с программой, при первом запуске.
Спасибо всем причастным!
Список изменений:
✅ Перевод новой части интерфейса на английский и арабский
✅ Добавлена возможность индикации звуком при переключении раскладок и наборе текста
✅ У вкладок настроек появились иконки
🛠 (исправление) Опечатки в английском переводе
Индикатор раскладки 2.9.3 - тестовая версия
Не думал об озвучивании нажатий клавиш для разных раскладок. Давно печатаю в слепую на обоих языках и сразу вижу, если начал не на том, плюс цвет панели и флажки помогают.
Когда Владимир написал эту идею, просто добавил в список, где лежат все задумки. Потом вспомнил как один коллега, которому я посоветовал поставить Индикатор, сказал, что он при печати не смотрит на экран, поэтому моё приложение не поможет. И вообще, стали часто попадаться на глаза люди, печатающие не на том языке, уткнувшись в клавиатуру. Так, потихоньку, эта идея становилась всё более привлекательной. Да и если бы я добавлял в программу только то, что нужно лично мне, она бы замерла примерно на версии 1.1 😊
К пожеланиям Владимира присоединился Oleg, с тезисом, что озвучивать каждое нажатие — это перебор, нужно отключать звук после какого-то времени с момента переключения либо после определённого количества символов.
Такое ТЗ легло в основу доработки. Благо теперь настройки для каждой раскладки на отдельной форме, просто добавил вкладку «🎶 Звуки». Сообразил, что в названия можно добавлять иконки юникода и добавил их, между делом, для всех вкладок.
У раскладки есть два события которые можно озвучить:
1. Переключение на неё
2. Нажатие клавиши, когда она активна
Встроил небольшую библиотеку звуков для обоих случаев. Рядом с выпадающем списком можно настроить громкость и послушать как они будут звучать.
С первым пунктом всё понятно, а вот озвучка нажатий может быть настроена более тонко. Выключаться по прошествую времени или набору определённого количества символов. И включаться обратно, если долго ничего не печатали.
Моё погружение в мир работы со звуком в .Net это история, заслуживающая отдельного поста. Там был весь спектр эмоций. 😊
Библиотека, позволяющая всё это делать, почему-то не хочет встраиваться в исполняемый файл, поэтому она пока будет появляться в директории с программой, при первом запуске.
Спасибо всем причастным!
Список изменений:
✅ Перевод новой части интерфейса на английский и арабский
✅ Добавлена возможность индикации звуком при переключении раскладок и наборе текста
✅ У вкладок настроек появились иконки
🛠 (исправление) Опечатки в английском переводе
Индикатор раскладки 2.9.3 - тестовая версия
👍4❤1
ХаритоновСофт
Индикация звуком Не думал об озвучивании нажатий клавиш для разных раскладок. Давно печатаю в слепую на обоих языках и сразу вижу, если начал не на том, плюс цвет панели и флажки помогают. Когда Владимир написал эту идею, просто добавил в список, где лежат…
Небольшие изменения перед релизом
Было неприятно, когда, при озвучивании, зажатая клавиша выдавала бесконечный звук. Терялось ощущение, что это звук именно нажатия. Теперь его будет слышно непосредственно при нажатии, один раз — пока клавиша не отпущена и нажата снова, звука по ней не будет.
Так же добавил перевод закладки с настройками звука.
Какое-то время поживу с этой версией, если полёт будет нормальным, отправлю в релиз.
Список изменений:
✅ Перевод новой части интерфейса на английский и арабский
🛠 (исправление) Озвучивание нажатия происходит один раз, при нажатии. При удерживании клавиши, звук не воспроизводится.
Индикатор раскладки 2.9.4 - тестовая версия
Было неприятно, когда, при озвучивании, зажатая клавиша выдавала бесконечный звук. Терялось ощущение, что это звук именно нажатия. Теперь его будет слышно непосредственно при нажатии, один раз — пока клавиша не отпущена и нажата снова, звука по ней не будет.
Так же добавил перевод закладки с настройками звука.
Какое-то время поживу с этой версией, если полёт будет нормальным, отправлю в релиз.
Список изменений:
✅ Перевод новой части интерфейса на английский и арабский
🛠 (исправление) Озвучивание нажатия происходит один раз, при нажатии. При удерживании клавиши, звук не воспроизводится.
Индикатор раскладки 2.9.4 - тестовая версия
Небольшой рассказ о доработке со звуком.
https://youtu.be/NimuWqZ1gc0
https://vk.com/video41085597_456239332
https://youtu.be/NimuWqZ1gc0
https://vk.com/video41085597_456239332
YouTube
Монологи об ИТ. Выпуск 1
https://www.ambiera.com/irrklang/index.html — библиотека для работы со звуком
https://khsoft.ru/li/ — Индикатор раскладки — программа для индикации текущего языка ввода
ТГ: https://t.me/classic_ivan_blog
DZ: https://dzen.ru/zapominai
VK: https://vk.com/…
https://khsoft.ru/li/ — Индикатор раскладки — программа для индикации текущего языка ввода
ТГ: https://t.me/classic_ivan_blog
DZ: https://dzen.ru/zapominai
VK: https://vk.com/…
👍1
Релиз Индикатор раскладки. Версия 3.0
Новая версия показала себя как стабильная.
Выложил все наработки на официальный сайт и повысил версию до 3.0
Не обошлось без ошибок, нашлась багуля при загрузке настроек от предыдущих версий. Пока отправляю всем, кто с этим столкнулся новую версию с багфиксом.
Изменил схему монетизации программы:
1. Увеличил цену на 200₽, теперь Индикатор стоит 500₽.
2. Написал на сайте, что все обновления, после покупки, будут бесплатными в течении года. Пока это только анонс, в программе ничего для этого не сделано. Сразу скажу, что все поддержавшие разработку деньгами и тестированием, так же будут получать обновления бесплатно, бессрочно. Когда проверка придёт в код, пока не знаю.
Подсмотрел эту схему на чужих продуктах, считаю вполне справедливой. Это увеличит мизерные шансы вывода программы на самоокупаемость.
Так же решил, что если, по какой-то причине, не смогу продолжать разработку, выложу исходники в свободный доступ.
Идеи для дальнейшего улучшения Индикатора:
* Менять цвет активного окна в зависимости раскладки. Будет работать не со всеми приложениями, лютый кастом не реагирует на системные вызовы смены цвета.
* Заменять системный курсор мыши. Программно это все делают через замену файла курсора. Не знаю, получится ли делать это быстро, без лагов. Нужно тестировать. Это позволит менять цвет самого указателя и снизит нагрузку на процессор, который кушает перемещение формы вслед за курсором.
* Улучшение формы назначения команд при переключении. Тут можно добавить встроенные операции, например, изменение состояний CapsLock и ScrollLock. Вывод уведомлений и т.п. Будет удобно выбирать готовые шаблоны и править их под себя.
* Отдельная закладка настроек для Undead раскладки. Это редкая экзотика, для тех кто работает с билингвальной раскладкой. Думаю, у этой фичи очень маленькая аудитория, но я один из них.)
* Продвинутый экранный индикатор. Чтобы можно было добавить несколько цветовых областей в разных частях экрана, а не только надпись и прямоугольник как сейчас.
* Добавить сбор статистики по настройкам с которыми работает программа. Это поможет понять, чем чаще люди пользуются, а чем не пользуются вообще. Плюс поможет с разбором багов.
Что из этого действительно нужно, понятия не имею. Всегда открыт к обратной связи и новым идеям. Обычно это основной источник новых фич. Сейчас планирую переключится на следующую свою разработку.
Сайт программы
Список изменений
✅ У программы появился инсталлятор. Теперь это основной способ установки
✅ Поддержка бесконечного количества раскладок
✅ Новая форма редактирования настроек для конкретной раскладки
✅ Новый формат файла хранения настроек для раскладок
✅ Поддержка файлов настроек от предыдущих версий
✅ Новые цвета раскладок по умолчанию
✅ Появилась возможность отдельно задать альтернативный цвет и альтернативный текст для плавающих индикаторов (мышь + каретка)
✅ Перевод новой части интерфейса на английский и арабский
✅ Добавлена возможность индикации звуком при переключении раскладок и наборе текста
✅ У вкладок настроек появились иконки
✅ Перевод новой части интерфейса на арабский и английский
🛠 (исправление) Форма подсветки панели задач становились бледными на некоторое время, перед тем как поменять цвет
🛠 (исправление) Опечатки в английском переводе
🛠 (исправление) Озвучивание нажатия происходит один раз, при нажатии. При удерживании клавиши, звук не воспроизводится.
🛠 (исправление) В очередной раз, исправлено исчезновение форм подсветки панели задач, по нажатию win+d, на некоторых версиях Виндовс
Новая версия показала себя как стабильная.
Выложил все наработки на официальный сайт и повысил версию до 3.0
Не обошлось без ошибок, нашлась багуля при загрузке настроек от предыдущих версий. Пока отправляю всем, кто с этим столкнулся новую версию с багфиксом.
Изменил схему монетизации программы:
1. Увеличил цену на 200₽, теперь Индикатор стоит 500₽.
2. Написал на сайте, что все обновления, после покупки, будут бесплатными в течении года. Пока это только анонс, в программе ничего для этого не сделано. Сразу скажу, что все поддержавшие разработку деньгами и тестированием, так же будут получать обновления бесплатно, бессрочно. Когда проверка придёт в код, пока не знаю.
Подсмотрел эту схему на чужих продуктах, считаю вполне справедливой. Это увеличит мизерные шансы вывода программы на самоокупаемость.
Так же решил, что если, по какой-то причине, не смогу продолжать разработку, выложу исходники в свободный доступ.
Идеи для дальнейшего улучшения Индикатора:
* Менять цвет активного окна в зависимости раскладки. Будет работать не со всеми приложениями, лютый кастом не реагирует на системные вызовы смены цвета.
* Заменять системный курсор мыши. Программно это все делают через замену файла курсора. Не знаю, получится ли делать это быстро, без лагов. Нужно тестировать. Это позволит менять цвет самого указателя и снизит нагрузку на процессор, который кушает перемещение формы вслед за курсором.
* Улучшение формы назначения команд при переключении. Тут можно добавить встроенные операции, например, изменение состояний CapsLock и ScrollLock. Вывод уведомлений и т.п. Будет удобно выбирать готовые шаблоны и править их под себя.
* Отдельная закладка настроек для Undead раскладки. Это редкая экзотика, для тех кто работает с билингвальной раскладкой. Думаю, у этой фичи очень маленькая аудитория, но я один из них.)
* Продвинутый экранный индикатор. Чтобы можно было добавить несколько цветовых областей в разных частях экрана, а не только надпись и прямоугольник как сейчас.
* Добавить сбор статистики по настройкам с которыми работает программа. Это поможет понять, чем чаще люди пользуются, а чем не пользуются вообще. Плюс поможет с разбором багов.
Что из этого действительно нужно, понятия не имею. Всегда открыт к обратной связи и новым идеям. Обычно это основной источник новых фич. Сейчас планирую переключится на следующую свою разработку.
Сайт программы
Список изменений
✅ У программы появился инсталлятор. Теперь это основной способ установки
✅ Поддержка бесконечного количества раскладок
✅ Новая форма редактирования настроек для конкретной раскладки
✅ Новый формат файла хранения настроек для раскладок
✅ Поддержка файлов настроек от предыдущих версий
✅ Новые цвета раскладок по умолчанию
✅ Появилась возможность отдельно задать альтернативный цвет и альтернативный текст для плавающих индикаторов (мышь + каретка)
✅ Перевод новой части интерфейса на английский и арабский
✅ Добавлена возможность индикации звуком при переключении раскладок и наборе текста
✅ У вкладок настроек появились иконки
✅ Перевод новой части интерфейса на арабский и английский
🛠 (исправление) Форма подсветки панели задач становились бледными на некоторое время, перед тем как поменять цвет
🛠 (исправление) Опечатки в английском переводе
🛠 (исправление) Озвучивание нажатия происходит один раз, при нажатии. При удерживании клавиши, звук не воспроизводится.
🛠 (исправление) В очередной раз, исправлено исчезновение форм подсветки панели задач, по нажатию win+d, на некоторых версиях Виндовс
khsoft.ru
Индикатор раскладки (Layout Indicator)
Программа для индикации текущего языка ввода
👍4🔥1
Статистика и проникновение Индикатор в мир
У меня, возле монитора, висит планшет, как у дальнобойщиков. Там время, пробки, погода, количество дней до ближайших событий, остатки банковских счетов и прочая статистика.
Там же, выводится гистограмма по Индикатору. Каждый день представлен четырьмя столбиками: сколько раз приложение было скачано, сколько раз триальные копии вышли на связь, аналогичная цифра по зарегистрированным и количество покупок.
Недавно проснулся, а у меня за день 500+ скачиваний, это аномалия, обычно меньше 20ти. Пошёл смотреть, оказалось какой-то умелец с немецкого хостинга поставил скачивание файла или проверку его даты создания (это один и тот же запрос), на _каждую_ минуту. Я привык к тому, что боты некоторых софтверных порталов ставят чекеры на случай обновления, чтобы побыстрей скачать новую версию, начинить её троянами и выложить бесплатно. Но чтобы каждую минуту, это он явно погорячился, я с таким рвением новые релизы не делаю. 😊
Смотреть статистику — это отдельный вид удовольствия. Можно узнать из какой страны кулхацкер ломает программку, это видно по изменённому содержимому исполняемого файла. Видел запросы из Тайланда и Алжира. Но самая активная, ломанная версия, приходит с Родины, в зарегистрированном на IP адресе, стоит Верхняя Пышма, Ленина, 1 😂
Там же, иногда, видно откуда перешли на ссылку для скачивания. После недавнего обновления, меня, похоже обнаружил владелец нескольких иностранных софт-порталов. Статья про индикатор появилась сразу в паре мест. С забавным описанием, написанным, вероятно, нейронкой.
Вот такие образчики маркетинговой мысли там можно прочесть:
«В постоянно развивающемся мире инструментов повышения производительности «Индикатор раскладки» от Kharitonov Soft выделяется как выдающаяся утилита, предназначенная для оптимизации процесса набора текста.» 🔥🔥
Запишу себе в резюме, что являюсь автором выдающейся утилиты для повышения производительности. 💪
У меня, возле монитора, висит планшет, как у дальнобойщиков. Там время, пробки, погода, количество дней до ближайших событий, остатки банковских счетов и прочая статистика.
Там же, выводится гистограмма по Индикатору. Каждый день представлен четырьмя столбиками: сколько раз приложение было скачано, сколько раз триальные копии вышли на связь, аналогичная цифра по зарегистрированным и количество покупок.
Недавно проснулся, а у меня за день 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 — инструкция для желающих повторить.
В 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
Накопилась кучка неприятных багуль по Индикатору.
Были безжалостно повержены.
Так же сделал дополнительную вкладку на форме настроек «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
Небольшие доработки и исправления, перед тем как зазесть за главную беду — поиск нового способа получить текущую раскладку в винде.
Вернул кнопкам цвет, добавил инфы в диагностику. Заодно сделал перемещение индикатора каретки мышью, теперь можно быстро убрать, если мешает.
Список изменений
✅ Индикатор каретки теперь можно перемещать мышкой
✅ Добавлена информация об экранах на вкладке диагностики
🛠 (исправление) Кнопки выбора цвета не красились в выбранный цвет
https://khsoft.ru/download/test/LayoutIndicator.v3.0.4.test.zip
👍3🔥1
Добрался до Индикатора — давно чесались руки. Несколько лет назад, практически пропала возможность отладки проекта. Из-за сложности общения потоков между собой, дебагер вылетал, заявляя, что лезть к объекту из треда, в котором он не был создан — моветон. Когда совсем прижимало, находил обходные пути, но хотелось простого, человеческого дебага с которым можно двигаться в разы быстрее.
Глядя на корутины и прочие зелёные файберы, понимал, что это то, что нужно. Мне не надо многопоточности, мне нужна параллельность, если она будет ненастоящая, но при этом такая же быстрая и без тредовский головняков, то просто заткнитесь и заберите мои деньги.
Разводить глубокий ресёрч настроения не было, попробовал примерно три решения от GPT, остановился на реализации через таймер, работающий в главном UI-потоке. Довольно быстро отрефачил костяк приложения. Конечно же, появились лютые багули: созданные в родном потоке окна, внезапно начали перехватывать фокус при показе, всё это вгоняло поток в рекурсивную петлю, когда появлялся тестовый индикатор каретки. Но теперь у меня есть отладка! Огромная экономия времени.
И всё это ещё в Ридере, IDE для дотнета от брейнсов. На работе пишу js и groovy в IDEA, пхп и js пэты ковыряю на phpStorm, иногда захожу в DataGrip, короче я плотно сижу на идэехах от брейнсов. Каждый раз когда писал на VS, испытывал подгаралити. А тут как рыба в воде. Придётся теперь и на виртуалку его ставить, назад не вернусь, точно.
На радостях заредизайнил UI вкладки. С особым удовольствием прибрал вкладку мышиных индикаторов — там был свальных грех, стало почище. Тестовую версию не делал, пока всё очень сыро.
Глядя на корутины и прочие зелёные файберы, понимал, что это то, что нужно. Мне не надо многопоточности, мне нужна параллельность, если она будет ненастоящая, но при этом такая же быстрая и без тредовский головняков, то просто заткнитесь и заберите мои деньги.
Разводить глубокий ресёрч настроения не было, попробовал примерно три решения от 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
Изменений в коде много, наверняка что-то отвалилось. Уже давно не в состоянии пройти все тест-кейсы. Это, как минимум, штук 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-приложениях, чтобы можно было отрубить определялку по системному индикатору. Но на их улице сегодня праздник. Жители ликуют. Боже, чем я занимаюсь... (Смеюсь).
У меня был коварный план — посмотреть предложения от нейронки а потом покапать уже целенаправленно, туда где мне грезилось универсальное решение. Но об этом в следующей заметке сумасшедшего.
Прелопатив основную часть, запустил новую версию на своих настройках и словил жуткие фризы, всё залипало и еле двигалось. Оказалось, из-за поддержки клавиатур Corsair. Попытки подключится к ним, жили в отдельном потоке. Немного помучив нейронку вопросами как бы дождаться подключения и UI не зафризить, по старинке написал колбэк, хоть и очень не хотелось специально для этого менять код.
Достал из сусеков клавиатуру и затестил, всё мигает как раньше, ничего не виснет, во всех кейсах. Там своя атмосфера. Стандартная библиотека реализует работу не с самой клавиатурой а с API сервера для устройств Corsair. Поэтому, много чего может не быть. Сервера, подключения к серверу, подключения клавиатуры к серверу. Не так-то просто мигать подсветкой кнопочек.
Есть, кстати, прекрасная открытая библиотека, которая управляет цветом и поддерживает кучу устройств. Там и мыши и кулеры и материнские платы. Она даже дотнетовская, смотрел код когда писал свою поддержку. Получается можно всё это затащить в Индикатор, но как это тестировать без реального железа — не представляю.
Победив подвисания, начал жить на новой версии и сразу заметил, что индикация чуть запаздывает. Какие-то жалкие миллисекунды, работать можно, но раздражает страшно. Тут же попробовал прошлую версию, подтвердил, что дело в однопотоке. Покопался в обработке очереди на таймер — не помогло. Откатываться на мультитред — не вариант. Пришла идея сделать переключатель планировщика задач из однопоточного режима в многопоточный, таким образом, чтобы не менять код добавления задач. Довольно легко запилил, задержка ушла. Задав командой препроцессора #if DEBUG переключение в сингл-режим, я получил и отладку и скорость прошлых версий. Вот это я называю вин-вин.
Потом правда, выяснилось, что бывают багули, которые вылезают только в потоках и отладить их не получится, но тогда есть знание, что они именно такие, а это уже пол дела.
Дойдя до логического конца с этим режимом, занялся проблемой с которой чаще всего обращались в последнее время — определение раскладки по системному индикатору. Он мистическим образом пропадал с радаров, а где-то и вовсе не находился в известных местах.
К задаче подошёл творчески, спросил что делать у GPT, не давая никаких намёков на пути решения. За много лет, я уже, наверное, знаю все способы получения языка в Windows. Причём, львиную долю пробовал либо реализовывал на практике.
ИИ не обрадовал. Единственный новый способ, который он выдал, внутри, опирался на старый добрый вызов winapi, это первое, что предлагают бедолагам, решившим программно получить текущую раскладку. Но! В дебрях его решения был один нюанс, который не сразу бросился в глаза, а при проверке оказалось, позволяет решить проблему получения разных раскладок внутри одного языка, если способ определения — не системный индикатор.
Без понятия сколько людей на земле используют разные раскладки одного языка. И сколько из них не работают в консольных и UWP-приложениях, чтобы можно было отрубить определялку по системному индикатору. Но на их улице сегодня праздник. Жители ликуют. Боже, чем я занимаюсь... (Смеюсь).
У меня был коварный план — посмотреть предложения от нейронки а потом покапать уже целенаправленно, туда где мне грезилось универсальное решение. Но об этом в следующей заметке сумасшедшего.
👍2
«А что, если получить доступ к памяти индикатора Windows?» — подумал как-то я. Отладчики же умеют, чем мы хуже? Подцепимся к процессу, сдампим память, покопаемся в байтиках. Понимаю, звучит утопически, но вдруг. Выслушав грязные подробности об архитектуре индикации языка, да, там целая архитектура, вкрадчиво поинтересовался у ИИ: «а вот если, допустим, один мой друг, хочет вскрыть память индикации винды и всё от туда узнать про текущую раскладку. Как ему это сделать? Спрашиваю не для себя, сам таким не занимаюсь, конечно же».
Ответ меня обрадовал. Говорит: «вот тебе код, получай дамп, ищи вот эти байты, оно и есть ID раскладки». Заранее радовался не сильно, т.к. опытный заклинатель ИИ. Получив первые дампы для разных раскладок и обнаружив их абсолютную идентичность, спросил, с праведным гневом, где же мой ID раскладки? А там всё по классике: «Да он там вообще не бывает, с чего ты решил тут искать, что, я посоветовал? Извини, бес попутал, то, что тебе нужно вообще невозможно. Хочешь адрес ближайшей психологической помощи, скажи, я напишу».
Сохранив наработочки для будущих обострений, идею отложил.
Как не удивительно, но единственный, более-менее простой, способ, программно узнать текущую раскладку ввода в Windows, во всех классах приложений — воспользоваться технологией, созданной для слепых. Благодаря таким людям, мы можем программно считать с экрана называние языка. На дворе 2025й. Но и тут не всё так просто. Разработчикам майкрософт не занимать творческой энергии и бОльшая её часть расходуются, на перемещение индикатора раскладки внутри компонентов панели задач. Сам лично видел пять-шесть вариантов в разных версиях, плюс пользователи присылали интересные логи.
Изначально, переоценил свои силы: встроил генерацию файла, в случае ошибки, при работе с системным индикатором. Сама мысль верная, но внутрь положил деревья описывающие UI, от самого корня, двумя способами. Только такое количество данных, позволяло вдумчиво написать фильтры получения нужного компонента. Подразумевалось, что человек увидит сообщение с просьбой о помощи и перешлёт файл.
Тут сразу несколько минусов. Во-первых всё это генерировалось довольно долго, сделать видимость процесса поленился, поэтому нужно было подождать, найти файл и отправить его. За всё время существования такой возможности, прошёл этот квест всего один человек, за что ему огромное спасибо.
Конечно, можно было автоматически кинуть инфу на какой-нибудь из своих серверов, но это чистой воды троян. Утечь могло всё что угодно, включая чувствительные данные. Мы такое не делаем.
Во-вторых, задумывалось, что я каждый раз буду внимательно изучать этот дар богов и писать правила поиска в деревьях. Под каждый случай творческого припадка Windows-разработчиков. Жизнь показала, что у меня нет на это времени и сил. Конечно, если бы какой-нибудь очень богатый мужчина или женщина, решили регулярно поддерживать столь экзотическую активность, можно было бы подумать. Но у меня работа, шесть котов, велосипед и лодка.
Поэтому, было принято радикальное решение — снести к чертям все эти городульки и сделать божественно простой алгоритм поиска родного индикатора языка. Поделюсь им с вами: берём дерево элементов таскбара с основного монитора (на нём живёт индикатор), с глубиной потомков 3 (хватает 2, ещё одно поколение заложил на будущее), ищем первый элемент, текст с которого совпадёт с названием любой из раскладок, установленных в системе. Всё.
Ладно, не совсем всё, для некоторых версий десятой Windows, невозможно получить полный текст подсказки элемента, если в нём присутствуют переводы строк (обожаю IT!). Так что за простоту мы заплатили деградацией функционала: на особых версиях десятки, будут неправильно определяться разные раскладки одного языка. Такова жизнь.
Поэтому искать пришлось не только по имени раскладки но и по языку, если по имени не получилось. Закончилось всё хорошо, стабильно нахожу нужный элемент, в всех доступных мне версиях.
Ответ меня обрадовал. Говорит: «вот тебе код, получай дамп, ищи вот эти байты, оно и есть ID раскладки». Заранее радовался не сильно, т.к. опытный заклинатель ИИ. Получив первые дампы для разных раскладок и обнаружив их абсолютную идентичность, спросил, с праведным гневом, где же мой ID раскладки? А там всё по классике: «Да он там вообще не бывает, с чего ты решил тут искать, что, я посоветовал? Извини, бес попутал, то, что тебе нужно вообще невозможно. Хочешь адрес ближайшей психологической помощи, скажи, я напишу».
Сохранив наработочки для будущих обострений, идею отложил.
Как не удивительно, но единственный, более-менее простой, способ, программно узнать текущую раскладку ввода в Windows, во всех классах приложений — воспользоваться технологией, созданной для слепых. Благодаря таким людям, мы можем программно считать с экрана называние языка. На дворе 2025й. Но и тут не всё так просто. Разработчикам майкрософт не занимать творческой энергии и бОльшая её часть расходуются, на перемещение индикатора раскладки внутри компонентов панели задач. Сам лично видел пять-шесть вариантов в разных версиях, плюс пользователи присылали интересные логи.
Изначально, переоценил свои силы: встроил генерацию файла, в случае ошибки, при работе с системным индикатором. Сама мысль верная, но внутрь положил деревья описывающие UI, от самого корня, двумя способами. Только такое количество данных, позволяло вдумчиво написать фильтры получения нужного компонента. Подразумевалось, что человек увидит сообщение с просьбой о помощи и перешлёт файл.
Тут сразу несколько минусов. Во-первых всё это генерировалось довольно долго, сделать видимость процесса поленился, поэтому нужно было подождать, найти файл и отправить его. За всё время существования такой возможности, прошёл этот квест всего один человек, за что ему огромное спасибо.
Конечно, можно было автоматически кинуть инфу на какой-нибудь из своих серверов, но это чистой воды троян. Утечь могло всё что угодно, включая чувствительные данные. Мы такое не делаем.
Во-вторых, задумывалось, что я каждый раз буду внимательно изучать этот дар богов и писать правила поиска в деревьях. Под каждый случай творческого припадка Windows-разработчиков. Жизнь показала, что у меня нет на это времени и сил. Конечно, если бы какой-нибудь очень богатый мужчина или женщина, решили регулярно поддерживать столь экзотическую активность, можно было бы подумать. Но у меня работа, шесть котов, велосипед и лодка.
Поэтому, было принято радикальное решение — снести к чертям все эти городульки и сделать божественно простой алгоритм поиска родного индикатора языка. Поделюсь им с вами: берём дерево элементов таскбара с основного монитора (на нём живёт индикатор), с глубиной потомков 3 (хватает 2, ещё одно поколение заложил на будущее), ищем первый элемент, текст с которого совпадёт с названием любой из раскладок, установленных в системе. Всё.
Ладно, не совсем всё, для некоторых версий десятой Windows, невозможно получить полный текст подсказки элемента, если в нём присутствуют переводы строк (обожаю IT!). Так что за простоту мы заплатили деградацией функционала: на особых версиях десятки, будут неправильно определяться разные раскладки одного языка. Такова жизнь.
Поэтому искать пришлось не только по имени раскладки но и по языку, если по имени не получилось. Закончилось всё хорошо, стабильно нахожу нужный элемент, в всех доступных мне версиях.
🔥2🤯1
Дальше был классический реалити-чек. Элемент есть, а текст его считывается не всегда, примерно, один раз из ста может не считаться, плюс минус двести обращений, это не точно, зависит от частоты попыток, но не всегда. Что ты пристал, скажи спасибо, что он с экрана не пропадает. Хотя, может и пропадает, просто мы не видим — очень быстро восстанавливается, по сверхбыстрому таймеру. Вообще не удивлюсь, если это так.
Отлавливаю эти провалы в логах и вижу рейскондишн, это когда потоки начинают глючить из-за одновременного доступа к общим частям кода. Ставлю лок-блок, это когда ты помечаешь место которое должно выполняться одним потоком, в один момент времени, остальные ждут своей очереди. И чтобы вы думали? Рейскондишн сохраняется. Иду к GPT, он объясняет, что свой код ты конечно обезопасил, молодец, но вот этот вот AutomationElement который ты дёргаешь, он вообще сделан нот сафети мультитред, да и пропадает часто, нет ему никакой веры! И вообще, они когда эту штуку для слабовидящих делали, ни про какую многопоточность не думали.
На опыте делаю сигнл-тред планировщик и оборачиваю им получение элемента. Проблема параллельного кода ушла. Ура. Теперь элемент не отдавал текст уже в одном потоке, изредка. Пришлось всю эту конструкцию украсить повторением проверки. Не получилось с первого раза? Не беда, попробуем ещё раз. И ещё. И только если три раза не вышло, генерим файл с нашим небольшим деревом (на моём таскбаре — 150 строк), в котором минимум информации, только необходимое и слёзно просим прислать. Благо такое можно и мессенжере кинуть.
Попутно разрулил старый баг, который то пропадал то возвращался. Помогло общение с ИИ. Часто менял тред в котором работаю с UI, но уже постфактум, когда всплывали ошибки. А тут он мне популярно объяснил: есть UI-поток, и всё, что касается интерфейса, нужно делать в нём. Красить, менять, скрывать, показывать, просто перемещать, всё в нём. Преисполнившись этим знанием переписал пару мест, багули рассосались.
Как же я долго программировал... Ещё одна прохладная история в следующем посте и спать.
Отлавливаю эти провалы в логах и вижу рейскондишн, это когда потоки начинают глючить из-за одновременного доступа к общим частям кода. Ставлю лок-блок, это когда ты помечаешь место которое должно выполняться одним потоком, в один момент времени, остальные ждут своей очереди. И чтобы вы думали? Рейскондишн сохраняется. Иду к 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, руками. Пишу эти строки и понимаю, что официальный релиз лежит с этой багулей, прямо сейчас. Что ж, будет повод не затягивать с новой версией. Такой ценой был приобретён опыт.
У меня всё. Спасибо за внимание.
Вибокс был такой старый, что там почему-то была прописана несуществующая сетевая карта, поменять которую конечно же просто так нельзя. Я говорил вам что обожаю 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👍2❤1
Делаю клавиатуру мечты из детского конструктора.
Эксперименты в области клавиатуростроения
Эксперименты в области клавиатуростроения
YouTube
Клавиатура, трекбол и детский конструктор
ТГ: https://t.me/classic_ivan_blog
DZ: https://dzen.ru/zapominai
VK: https://vk.com/video/@classic_ivan
RT: https://rutube.ru/channel/31567846/
YT: https://youtube.com/c/zapominai
TT: http://asdf123.ru
DZ: https://dzen.ru/zapominai
VK: https://vk.com/video/@classic_ivan
RT: https://rutube.ru/channel/31567846/
YT: https://youtube.com/c/zapominai
TT: http://asdf123.ru
🔥3
Добрался до релиз-кандидата. Замораживаю для новых фич, правлю багули.
Переход с VisualCode на Rider оказался прорывным. Поработал с профилировщиком, очень достойно. Это такая штука, которая показывает, как и где твоё приложение расходует ресурсы.
Тестирование, во время разработки, сводится частому переключению раскладок. В один из таких сеансов, заметил повышенную нагрузку на процессор в некоторых приложениях. Подозрение сразу пало на текстовый курсор (каретку), только у него сильная зависимость от текущего окна.
Поиск координат каретки в Windows — отдельный вид извращения. Есть два известных способа. Первый, быстрый и лёгкий, мгновенно выдаёт результат, но работает не везде. Второй тяжёлый и сложный, может сработать там, где первый не справился. Работает ли он везде? Конечно же нет. Очень много приложений не отдают информацию о своей каретке, не знаю почему, может сами её рисуют, в обход системных средств.
Так и живём, пробуем первый путь, если не сработало, переключаемся на второй. При этом нельзя сделать список приложений, где искать каретку бессмысленно. Потому что, внутри может быть бесконечная сложность интерфейса, когда и где в нём внезапно обнаружится текстовое поле, предсказать невозможно. Приходится постоянно теребить систему, после каждого клика, нажатия клавиши или переключения приложения.
И можно забить, если бы не потребление ресурсов. Максимально универсальным, этот метод делал самостоятельно, просто копаясь в дебрях ОС. Получился такой алгоритм:
1. Берём процесс активного окна. Тут можно кэшировать. Первый раз запоминаем у какого окна какой процесс, все последующие обращения идут в память.
2. Начинаем перебирать все треды процесса. Потому-что получить координаты вторым способом можно только из тредов. А их может быть овердофига. Практика показала, что можно смотреть первые 10, этого достаточно для большинства случаев.
Процессору это тяжело, особенно если каждый раз ничего не находится.
Начал ещё раз копать эту тему и почти сразу обнаружил, что искать имеет смысл только в GUI-потоке, о существовании которого узнал недавно. Это так логично: если для операций с интерфейсом есть специальный поток, то и каретку нужно искать в нём. Имеется специальный метод, чтобы его получить. Плюс он кэшируемый, менять GUI-поток — лютая экзотика, которой можно пренебречь.
Переписал, проверил, нагрузка ушла, полегчало значительно. Сколько же лишних тактов моё детище сожрало по всему миру? Иран, Венгрия, Россия-матушка... пожрал электричество почём зря. Такова цена опыта.
Ещё, в арсенале для разработки Индикатора, есть стресс-тест: цикл на 4000 операций. В каждой запрашиваем раскладку и мигаем всеми индикаторами. Давно не пускал, а тут удача — удалось воспроизвести очень редкий баг с переполнением GDI объектов. Оказалось, при смене иконки приложения в системном лотке, нужно обязательно вызывать метод ОС для чистки памяти. Поправил.
В процессе изменений, поймал ошибку — не все индикаторы совпадали. Например, на экране одна раскладка, возле курсора другая. У этого явления интересная природа, причина которой опять упирается в нестабильность методов ОС. Есть стандартный способ подписаться на событие «смена языка ввода», угадайте, работает ли это всегда и везде?
Поэтому приходится полагаться на целую группу событий, если хоть одно произошло, возможно, сменится раскладка. Мой минимальный список:
1. Нажатие клавиш. Тут всё понятно, просто переключили язык, аль-табнулись в приложение, где он другой.
2. Клик. Могут выбрать язык через системный индикатор, либо переключить приложение.
3. Переключение приложений. Это может случится без нажатия на клавиши и кликов. Например, всплытие модального окна или тупо перехват фокуса.
Переход с 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
И всё было бы просто, если не один нюанс — переключение раскладки не мгновенная операция. Если вы кликнете в системном индикаторе на новый язык, то в обработчике клика, он будет старым, проверять нужно, примерно, через 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
Всем чёткой индикации!
Спасибо всем, кто качал тестовую сборку. Сам тоже проверил, до чего успел добрался.
Отправляю в свободное плавание. По статистике сайта, кучка роботов проверяет номер версии каждый день. После релиза всегда всплеск скачиваний. Мне представляется группа людей, качающих Индикатор, приговаривая: «ну что, может хоть в этой версии он всё починил» 😁.
Получилось довольно плотное обновление. Доволен. Но это пока не полетели баг-репорты 😁 — бывали у меня релизы-провалы.
Если у вас уже стоит 3.0.7 (тестовая), можете не спешить с обновлением: основные отличия — в доработке интерфейса, было криво при масштабировании, в паре мест.
Из 25 изменений, ИИ выделил 6 самых значимых:
* Обновлён пользовательский интерфейс
* Индикатор положения каретки теперь можно перемещать с помощью мыши
* Улучшен алгоритм определения раскладки по системному индикатору — стал быстрее и надёжнее
* Повышена точность индикации и синхронизации языковых раскладок
* Оптимизирован поиск каретки — снижена нагрузка на процессор
* Исправлен сбой при отключении отображения флагов — работа программы больше не прерывается
Сайт программы: https://khsoft.ru/li
Всем чёткой индикации!
khsoft.ru
Индикатор раскладки (Layout Indicator)
Программа для индикации текущего языка ввода
❤6