Воскрешение NumLockCalc после 17 лет забвения

от автора

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

Программа, достойная благодарности

Я про NumLock Calculator 3.3 Владимира Потапова из Иркутска. Кто пользовался – кивает прямо сейчас. Кто не пользовался – представьте: жмёшь NumLock, появляется калькулятор, жмёшь ещё раз, и он спрятался в трей. Всё. Одна клавиша, которая 99% времени ничего не делает (вот честно, кто из вас осознанно включает/выключает режим цифрового блока?), вдруг становится самым быстрым инструментом на рабочем столе. Последнее её обновление было

Почти 25 (Двадцать пять!!!) лет верой и правдой. Быстрее, чем ткнуть мышкой иконку калькулятора. Результат в буфер и далее в документ. И так сотню раз в неделю. До момента обновления Win10 → 11, и до запрета *.exe на корпоративной технике.

Главная проблема в том, что палец всё равно сам тянется к NumLock, а там пустота, т.к. рефлекс на подкорке. Но время идёт: встроенный калькулятор Windows подтянул внешний вид, обзавёлся функциями, плюс хочется ещё и прозрачности, изменения размера, стиля под интерфейс 11-ой.

Я пробовал новые аналоги. Я пробовал AutoHotkey-скрипты. Часто думал, что отстал от жизни, что нормальные люди уже давно открывают калькулятор через мышь и не страдают. Но нет, палец всё равно шёл на NumLock. И каждый раз был маленький укол: всё, больше не работает.

Три ночи на прототип

Я не разработчик, а жертва своей идеи. Как и в истории с КругоЗором, в роли исполнителя нейросеть; в роли заказчика, тестировщика, и я с кофе в три ночи.

Задача звучала на пять минут: перехватить NumLock, показать/спрятать калькулятор Windows, вернуть NumLock обратно в предыдущее положение, чтобы не мешать тем, кто им пользуется. На деле — пару неполных ночей.

import keyboardkeyboard.on_press(lambda e: toggle() if e.name == 'num lock' else None)

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

if not (GetKeyState(VK_NUMLOCK) & 1):    keybd_event(VK_NUMLOCK, 0, 0, 0)    keybd_event(VK_NUMLOCK, 0, KEYEVENTF_KEYUP, 0)

Проблема вторая: калькулятор в Windows 11 — это приложение. Он живёт внутри хостового окна ApplicationFrameWindow, и если его свернуть обычным ShowWindow(SW_MINIMIZE), следующее нажатие NumLock не разворачивает его, а создаёт второй экземпляр. Пришлось нейросети разбираться с cloaked-окнами через DwmGetWindowAttribute(DWMWA_CLOAKED).

Проблема третья: прозрачность. Нативного калькулятора Windows API не предоставляет, но можно навесить WS_EX_LAYERED на чужое окно и крутить альфу через SetLayeredWindowAttributes. Получилось через пять попыток.

Через три ночи я получил ровно то, что хотел: палец на NumLock → калькулятор появляется, ещё раз → прячется. Прозрачность — ползунком в трее. Выложил себе в одну папку, забыл.

Как и с КругоЗором, я думал — на этом всё.

Как и с КругоЗором, я ошибался.

Когда недоделки не дают спать

Одержимость — это не когда ты запускаешь новый стартап. Одержимость — это когда одна нереализованная функция не даёт спать, и пока не доделаешь, тебя будет трясти.

На следующий день я вбивал в калькулятор цифры, получал результат, копировал, вставлял в смету и дописывал руками «₽/м²». И думал: а почему эти единицы измерения я каждый раз вбиваю руками? У меня же иконка в трее, в ней меню, в меню всё что угодно.

Появилось подменю «Единицы измерения». Один клик – и в буфер добавляется «млн. ₽/м²» к уже скопированному числу. Категории: валюта, площадь, масса, стройматериалы. Список читается из простого текстового файла units_menu.txt, чтобы каждый настроил под свой рабочий контекст.

Ещё через неделю: заметки прямо в меню трея. Строка ввода, Enter, и в заранее указанный .md-файл для уважаемого Obsidian. Дописывается строка с датой-временем. Без открытия Obsidian, без Alt-Tab в Notion, без потери фокуса. Пришла мысль — зафиксировал за две секунды. Форматы: md / txt / rtf.


Что в итоге:

CalcNumLock v7.3. ≈3000 строк Python + PyQt5, 50 МБ onefile-exe.

  • NumLock открывает/прячет Windows Calculator. Или любой выбранный exe.

  • Прозрачность — ползунком в трее, запоминается.

  • Единицы измерения — меню в трее, клик → в буфер (с опцией автовставки в курсор).

  • Заметки — поле ввода прямо в меню трея, Enter пишет в md/txt/rtf.

  • Учёт времени — CSV по дням, категории процессов, пауза, HTML-отчёт с графиками, экспорт за период.

  • Скриншоты — по смене окна или по таймеру, с автоматическим замедлением при ВКС, исключениями по exe, лимитом по диску и дням.

  • Всё в одном дарк-меню и одном диалоге настроек — шесть вкладок, раздел «Пути» показывает все файлы программы.

Собирается в один .exe — Python на целевой машине не нужен.

Бесплатно | Без рекламы | Работает без интернета


Что это значит (по честному)

Как и КругоЗор – это не бизнес. Это мой инструмент. Если у вас такой же рефлекс на NumLock и такая же ностальгия по калькулятору Потапова – забирайте, пользуйтесь, правьте units_menu.txt под себя.

Я знаю, что это тоже не взлетит. Анар Бабайкин был прав в прошлой статье: сервис одной фичи не решает глобальной проблемы. Но есть чувство, которое ни один бизнес-консультант не отменит: когда ты 20 лет давишь на одну клавишу, потом эта клавиша перестаёт работать, а потом ты берёшь и заставляешь её снова работать своими руками, даже если под капотом там уже совсем другая программа, и при этом скрипт позволяет поставить любой exe, даже тот же NumLock Calculator 3.3 от Потапова

Просто починить мир в той точке, где лично тебе неудобно. Если тоже тянете палец к NumLock и испытываете фантомную боль, держите ссылку:

👉 CalcNumLockканал программы, дистрибутив и обратная связь

👉 Исходник открытыйGitHub репозиторий

ссылка на оригинал статьи https://habr.com/ru/articles/1027720/