Best practices AutoHotkey v1. Use when writing AHK v1 scripts to avoid critical errors like auto-execute section issues, includes order, and COM object handling.
Provides AutoHotkey v1 best practices to prevent critical errors like auto-execute section issues.
/plugin marketplace add theflysurfer/claude-skills-marketplace/plugin install theflysurfer-claude-skills-marketplace@theflysurfer/claude-skills-marketplaceThis skill inherits all available tools. When active, it can use any tool Claude has access to.
Guide structuré des bonnes pratiques AutoHotkey v1 pour développeurs et assistants IA
PARTIE I - RÈGLES CRITIQUES : Erreurs fatales à éviter absolument PARTIE II - STANDARDS FONDAMENTAUX : Encodage, nommage, architecture PARTIE III - DÉVELOPPEMENT : Patterns, GUI, performance PARTIE IV - VALIDATION : Tests et déploiement
La section auto-execute est le code qui s'exécute automatiquement au démarrage du script. C'est la source #1 des bugs incompréhensibles en AutoHotkey!
L'auto-execute se termine dès qu'AutoHotkey rencontre:
return expliciteExitNomFonction() {)::):)#SingleInstance Force
global myVar := "value"
MyFunction() { ; CETTE FONCTION TERMINE L'AUTO-EXECUTE!
MsgBox, Function
}
; CE CODE NE S'EXÉCUTERA JAMAIS AU DÉMARRAGE!
MsgBox, Script started ; Jamais affiché!
Menu, Tray, Icon, icon.ico ; Jamais chargé!
return
#SingleInstance Force
global myVar := "value"
; Code d'initialisation (s'exécute au démarrage)
MsgBox, Script started
Menu, Tray, Icon, icon.ico
; FIN EXPLICITE de l'auto-execute
return
; Fonctions (après le return)
MyFunction() {
MsgBox, Function
}
; Hotkeys (après les fonctions)
^a::
MyFunction()
return
#Directives (#SingleInstance, #Persistent, etc.)
↓
Variables globales
↓
AUTO-EXECUTE (code qui s'exécute au démarrage)
↓
return ← FIN EXPLICITE de l'auto-execute
↓
Fonctions
↓
Labels
↓
Hotkeys/Hotstrings
↓
#Include (À LA TOUTE FIN!)
Les #Include DOIVENT être À LA TOUTE FIN du fichier, après:
POURQUOI? Les modules appellent souvent des fonctions du fichier principal (comme Logger_Info). Si l'include est placé avant la définition de ces fonctions, le script plantera!
#Include %A_ScriptDir%\VA.ahk ; Chemin absolu TOUJOURS
%A_ScriptDir%\ pour les chemins absolusMsgBox, Device: %devices[1].name% ; ERREUR FATALE
deviceName := devices[1].name ; Extraire la propriété
MsgBox, Device: %deviceName% ; Utiliser la variable simple
globalMyFunction() {
global ; En DÉBUT de fonction seulement
; OU global var1, var2 pour variables spécifiques
}
MyLabel:
; Les variables sont globales par défaut dans les labels
; PAS de déclaration global nécessaire
return
.MaxIndex retourne "" (chaîne vide) pour un tableau vide, pas 0.
ArrayCount := Array.MaxIndex
if (ArrayCount = "") {
ArrayCount := 0 ; Conversion explicite
}
Loop % ArrayCount {
Element := Array[A_Index]
}
Sans UTF-8 avec BOM, les caractères accentués deviennent illisibles.
FileRead, var, *t *p65001 %file%FileAppend, content, %file%, UTF-8MonScript.ahk # Tout en un seul fichier
Projet/
├── Main.ahk # Point d'entrée
├── Config.ahk # Variables globales
├── Modules/
│ ├── Module1.ahk # Fonctionnalités
│ └── Module2.ahk
└── logs/ # Logs (auto-créé)
; Fichiers et dossiers : PascalCase
MyModule.ahk, Utils/, Core/
; Variables globales : MAJUSCULES
global LOG_ENABLED := true
global EMAIL_ADDRESS := "user@domain.com"
; Fonctions : PascalCase
SendEmailGmail()
GetAudioDevicesList()
; Variables locales : camelCase
local deviceName := "Speakers"
currentTime := A_Now
FunctionWithCOM() {
; 1. Créer les objets
if !(enumerator := VA_GetDeviceEnumerator()) {
return "Erreur création enumerator"
}
VA_IMMDeviceEnumerator_EnumAudioEndpoints(enumerator, 0, 1, devices)
; 2. Traitement
VA_IMMDeviceCollection_GetCount(devices, count)
Loop, %count% {
VA_IMMDeviceCollection_Item(devices, A_Index - 1, device)
; Traiter device...
ObjRelease(device) ; LIBÉRER CHAQUE OBJET
}
; 3. Nettoyage OBLIGATOIRE
ObjRelease(devices)
ObjRelease(enumerator)
}
Chaque objet COM créé DOIT être libéré avec ObjRelease().
Gui, Add, Edit, x10 y10 w500 h300 ReadOnly VScroll HScroll vContentArea
GuiControl,, ContentArea, %LongText% ; Scroll automatique
%A_ScriptDir%\MaxIndex = "" pour tableaux videsObjRelease()%var%%A_ScriptDir%\%var%, pas de propriétés d'objetsMaxIndex = ""ObjRelease() obligatoirereturn expliciteThis skill should be used when the user asks to "create a slash command", "add a command", "write a custom command", "define command arguments", "use command frontmatter", "organize commands", "create command with file references", "interactive command", "use AskUserQuestion in command", or needs guidance on slash command structure, YAML frontmatter fields, dynamic arguments, bash execution in commands, user interaction patterns, or command development best practices for Claude Code.
This skill should be used when the user asks to "create an agent", "add an agent", "write a subagent", "agent frontmatter", "when to use description", "agent examples", "agent tools", "agent colors", "autonomous agent", or needs guidance on agent structure, system prompts, triggering conditions, or agent development best practices for Claude Code plugins.
This skill should be used when the user asks to "create a hook", "add a PreToolUse/PostToolUse/Stop hook", "validate tool use", "implement prompt-based hooks", "use ${CLAUDE_PLUGIN_ROOT}", "set up event-driven automation", "block dangerous commands", or mentions hook events (PreToolUse, PostToolUse, Stop, SubagentStop, SessionStart, SessionEnd, UserPromptSubmit, PreCompact, Notification). Provides comprehensive guidance for creating and implementing Claude Code plugin hooks with focus on advanced prompt-based hooks API.