- Ce projet open source est une application Todo Windows native légère développée uniquement avec C et l’API Win32
- Elle fonctionne avec une taille minimale (26,5 KB au maximum) sans dépendre d’un framework, tout en implémentant directement une GUI Windows avancée et l’intégration au système
- En plus des fonctions de base comme ajouter, modifier, supprimer et marquer comme terminées les tâches, elle propose aussi des fonctions de productivité réelles comme l’intégration à la zone de notification et l’option de lancement automatique
- Le stockage persistant se fait dans un fichier binaire, avec jusqu’à 100 tâches enregistrées dans le dossier AppData
- Son point fort est une approche de programmation classique, très proche de l’OS, sans gros framework, avec un environnement d’exécution léger
🌟 Simple Todo (C / WinAPI)
Présentation du projet
- Ce projet crée une application Todo Windows native moderne en utilisant uniquement C et l’API Win32
- Il met en avant des capacités avancées de programmation GUI Windows et d’intégration au système
- Le projet est très léger (26,5 KB au maximum) tout en conservant l’apparence propre à Windows
✨ Fonctionnalités principales
- Création, modification et suppression de tâches
- Possibilité de marquer une tâche comme terminée
- Sauvegarde persistante dans AppData pour conserver les données en permanence
- Intégration à la zone de notification avec réduction dans le tray lors de la minimisation
- Apparence en style Windows natif
- Option de lancement automatique au démarrage de Windows
🛠️ Détails techniques
- Entièrement codé en pur C
- Utilise uniquement l’API Win32 pour l’implémentation de la GUI
- Taille d’exécutable minuscule (26,5 KB avec compression UPX)
- Fonction d’intégration à la zone de notification
- Application de styles visuels modernes via un manifeste
💾 Stockage des données
- Toutes les tâches sont stockées dans un seul fichier binaire
- Chemin de stockage :
%APPDATA%\\TodoApp\\todos.dat
- Format binaire avec prise en charge de 100 éléments maximum
📋 Prérequis
- Un environnement Windows est nécessaire
- MinGW-w64 (compilateur GCC) et le Windows SDK sont requis
🎮 Utilisation
- Lancez
bin/todo.exe, puis utilisez l’interface pour effectuer les actions suivantes
- Ajouter une nouvelle tâche avec le bouton "Add"
- Sélectionner un élément puis cliquer sur "Edit" pour le modifier
- Supprimer un élément avec "Delete"
- Marquer comme terminée avec "Complete"
- Possibilité de définir une priorité pour chaque élément
🏗️ Structure du projet
- Le dossier
src/ contient le point d’entrée principal (main.c), la logique de gestion des tâches (todo.c), les déclarations de structures (todo.h) et l’implémentation de la GUI (gui.c)
- L’exécutable compilé se trouve dans
bin/
- Le script de build (
build.bat) et la documentation du projet sont inclus
🔧 Éléments de développement
- API Win32 : implémentation de la gestion des fenêtres et de toute la GUI
- Common Controls : utilisation d’éléments d’interface modernes
- UXTheme : prise en charge de l’application des styles visuels Windows
- File I/O : mise en place de la sauvegarde persistante des données
📝 Licence
- Utilisation et modification libres sous licence MIT
🤝 Contribution
- Pull Requests bienvenues
- Tout le monde peut contribuer au projet
📫 Contact et liens
3 commentaires
Il y a un certain romantisme là-dedans.
Réactions sur Hacker News
strcpyetsprintf; si tu programmes sérieusement, il faut absolument utiliser des variantes avec vérification de longueur. Je suis surpris que le compilateur n’ait pas immédiatement affiché d’avertissement. L’API Win32 propose beaucoup de fonctions qui remplacent celles de la bibliothèque standard C. Si tu veux encore réduire la taille de l’exécutable, je te recommande d’essayer avec seulement<Windows.h>, sanscstdlib. Tu peux utiliserZeroMemoryà la place dememsetetCopyMemoryà la place dememcpy. Bien sûr, coder en C brut devient extrêmement pénible à partir d’un certain moment, mais les premières fois, faire les choses directement en pur C aide le plus à apprendre. On développe ce sens de la composition en manipulant tous ces petits détails. Si tu veux continuer à explorer la programmation GUI Win32, je recommanderais aussi WTL (Windows Template Library), qui encapsule l’API Win32 en C++ et facilite beaucoup la compréhension de son fonctionnement.strncpyau lieu destrcpy, sinon tout le monde va continuer à le signaler. L’une des grandes raisons d’utiliser Zig, c’est justement de réduire ce type d’erreurs courantes. Cela dit, le C reste très bien.memsetparZeroMemoryet dememcpyparCopyMemory, les intrinsics MSVC utilisent les instructionsrep stos/movs, ce qui produit un code plus compact qu’un appel de fonction et réduit aussi la taille de la table d’import.ZeroMemoryetCopyMemoryà la place dememsetetmemcpy, je me demande pourquoi ils ont créé ça au lieu d’utiliser simplement la bibliothèque standard C existante.CreateWindowà chaque fois, on écrivait souvent des ressources de dialogue dans un fichier.rc(Visual Studio fournit aussi un éditeur de dialogues) puis on utilisaitCreateDialog. Tous les contrôles étaient alors créés d’un coup. Il suffit ensuite d’ajouter un manifest d’application pour prendre en charge un style d’UI moderne ainsi que le DPI élevé.Ctrl-Adans les champs de texte et l’absence de la plupart des fonctions de base fournies par les frameworks pré-modernes, plus des erreurs lors de l’ajout de lignes. Du coup, je me demande en quel sens c’est « moderne ».user32:SetProcessDpiAwarenessContext,shcore:SetProcessDpiAwareness,user32:SetProcessDPIAware) ; sur des versions vraiment anciennes, il n’appelle rien du tout.build.batne fonctionne pas correctement quandcore.autocrlf=false. En repassant àcore.autocrlf=truepuis en reclonant, la compilation a marché. Une certaine toolchain MinGW produit un.exede 102 KB, donc bien plus efficace que 278 KB. Et si on veut réduire davantage, on peut ajouter des flags à GCC :gcc -s -Oz -fltopermet même de descendre à 47 KB. Si seule la taille du binaire t’intéresse, il y a encore beaucoup de marge d’amélioration.quickrun.exede 15 KB, uniquement en C et avec l’API Win32 pure. Il n’y a pas d’astuce secrète pour réduire le binaire, juste le compilateur Mingw32. C’est une appli GUI qui lance rapidement des applis via des alias.YoutubeGO, donc si tu veux y jeter un œil, ça me ferait plaisir.mallocet qu’on utilisestd::string,std::array,std::listet des espaces de noms anonymes, on obtiendra probablement un code deux fois plus court avec moins de bugs.std::stringoustd::listne signifie pas que l’assembleur généré sera identique ; ce commentaire montre surtout une mauvaise compréhension du fonctionnement interne.stringouarray/liststandard : si on utilise directement WinAPI, il est plus logique et recommandé d’utiliserLPWSTR(chaîne wide) plutôt questd::string, car c’est mieux adapté à l’API.LPWSTRest recommandé plutôt qu’une méthode ancienne commechar[]. Je ne pense pas questd::arrayoulistrendraient vraiment le code meilleur.On dirait presque que son souffle chaud arrive jusqu’ici…