Есть ли идеи? С чего начать? Что следует посмотреть? Существует ли редактор, который перегонит gif-файл в иконку или курсор? Достаточно ли просто найти анимированную иконку/курсор и присоединить ее при помощи LoadCursorFromFile к WC структуре и вызвать RegisterClassEx? Или нужны еще какие-то пляски с бубном?
Надеюсь поможет, надо проверять на пракике: --- --- Анимированный курсор: всё проще, чем кажется Вы почти правы. Последовательность действий для курсора действительно проста: Конвертируйте: Возьмите ваш GIF и превратите его в формат .ani. Загрузите: Используйте LoadCursorFromFile() для получения хэндла. Примените: Передайте этот хэндл в поле hCursor структуры WNDCLASSEX перед вызовом RegisterClassEx(). --- --- Анимированная иконка: нужен «костыль». Здесь есть важный нюанс. Стандартные поля hIcon и hIconSm ожидают статическую иконку (.ico). Если вы попытаетесь передать туда .ani, система, скорее всего, просто покажет первый кадр или ничего-6-12. Чтобы сделать иконку анимированной, нужно самостоятельно управлять её отрисовкой: Загрузите несколько статических иконок (HICON) в массив. Создайте таймер (SetTimer). В обработчике WM_TIMER меняйте текущую иконку окна, отправляя сообщение WM_SETICON. --- --- 1. Использование библиотеки Clickgen. Эта библиотека специально создана для сборки курсоров (включая Windows .ani) и абстрагирует всю работу с форматом. pip install clickgen 2. Подготовка кадров: Вам нужно сначала разбить ваш GIF на отдельные PNG-файлы (по одному на каждый кадр). Это можно сделать любым удобным способом (например, через Pillow или онлайн-конвертер). Пусть они лежат в папке frames/ с именами типа frame-001.png, frame-002.png и т.д. 3. Скрипт конвертации: Код (Text): from glob import glob from clickgen.parser import open_blob from clickgen.writer import to_win # 1. Собираем пути ко всем PNG-кадрам fnames = sorted(glob("frames/*.png")) # 2. Читаем файлы как бинарные данные pngs = [] for f in fnames: with open(f, "rb") as p: pngs.append(p.read()) # 3. Создаем объект курсора. # hotspot — это координаты "горячей точки" (x, y), которую система считает точкой клика. # Для стрелки это обычно (0, 0), для других курсоров нужно подбирать. cur = open_blob(pngs, hotspot=(0, 0)) # 4. Конвертируем в формат Windows # 'to_win' возвращает кортеж: (расширение_файла, бинарные_данные) ext, result = to_win(cur.frames) # 5. Сохраняем результат output_filename = f"my_cursor{ext}" with open(output_filename, "wb") as o: o.write(result) print(f"Готово! Файл сохранен как {output_filename}") Самая важная часть в коде — параметр hotspot в функции open_blob. Это координаты (x, y) внутри картинки, которые Windows будет считать «острием» курсора. Если поставить их неправильно (например, для курсора-руки поставить в левый верхний угол), то при клике система будет думать, что вы кликаете не туда, куда указывает курсор. Для простой стрелки обычно подходит (0, 0), но в некоторых случаях (например, если у вас есть прозрачные поля вокруг рисунка) их нужно подбирать вручную. --- --- Чем еще можно конвертировать GIF в ANI? С конвертацией GIF в .ani проблем нет, есть несколько путей: Онлайн-сервисы: Самый быстрый вариант. Например, iotools.cloud позволяет загрузить GIF, выбрать размер, задать «горячую точку» (hotspot) и скачать готовый .ani-4. Специализированный софт: AniTuner — бесплатная программа для Windows, умеет создавать и редактировать .ani из GIF, AVI или набора картинок-14. Steam: Simple Cursor Maker — платная, но удобная утилита в Steam, которая конвертирует GIF/PNG в .ani и позволяет сразу собрать установочный пакет-7. --- ---
Application, спасибо Нашел статью у Manhanter'a Создание анимированной иконки приложения Там он загружает 8 иконок, Код (ASM): .wminitdialog: invoke LoadIcon,[hInstance],1; Загрузить иконку invoke SendMessage,[hwnddlg],WM_SETICON,ICON_BIG,eax; Установить иконку окна invoke SetTimer,[hwnddlg],1,100,NULL; Установить таймер обновления иконки mov [nIcon],1 jmp .processed .animate: inc [nIcon]; Анимация иконки окна cmp [nIcon],8 jbe @f mov [nIcon],1; Перейти к первому кадру @@: invoke LoadIcon,[hInstance],[nIcon]; Загрузить следующую иконку invoke SendMessage,[hwnddlg],WM_SETICON,ICON_BIG,eax; Обновить иконку окна jmp .processed