Introduction aux échanges processuels
L'autonomisation native entre instances de script AutoHotkey v2 n'est pas directement supportée. Pour pallier cette limitation, il est nécessaire de mobiliser les mécanismes bas niveau du système d'exploitation. Cette approche permet soit le transfert de données srtucturées, soit la signalisation par codes messages personnalisés.
Architecture de transmission
Deux stratégies distinctes sont généralement employées pour établir un lien : une méthode basée sur le transfert de mémoire partagée pour les chaînes longues, et une méthode utilisant les notifications systèmes pour les paramètres légers.
Solution d'émission
La classe ci-dessous encapsule les appels à l'API Windows nécessaires pour envoyer des informatinos vers une fenêtre cible. Elle sécurise l'état du contexte lors de l'appel système.
; Module de communication émetteur
class CommunicateurSortant {
; Envoi d'une chaîne arbitraire via WM_COPYDATA
; Paramètres : CibleWindow, Données, Délai(4s par défaut)
statique EnvoyerContenu(CibleWindow, Texte, Délai := 4000) {
// Allocation tampon mémoire alignée sur la taille du pointeur
TamponMémoire := Buffer(3 * A_PtrSize)
CalculerTaille := (StrLen(Texte) + 1) * 2
NumPut("Ptr", CalculerTaille, "Ptr", StrPtr(Texte)
, TamponMémoire, A_PtrSize)
// Sauvegarde de l'état actuel du script
AncienCacheCaché := A_DetectHiddenWindows
ModeTitreCache := A_TitleMatchMode
// Configuration pour cibler la fenêtre
DetectHiddenWindows True
SetTitleMatchMode 2
// Appel système WM_COPYDATA (0x004A)
Résultat := SendMessage(0x4A, 0, TamponMémoire, , CibleWindow
, , , , Délai)
// Restauration des paramètres
DetectHiddenWindows AncienCacheCaché
SetTitleMatchMode ModeTitreCache
Return Résultat
}
// Transmission de paramètres bruts via PostMessage
statique EnvoyerParamètres(TitreFenêtre, ValInt, ValLarg, CodeMsg := 0x5555) {
AncienCacheCaché := A_DetectHiddenWindows
DetectHiddenWindows True
If (WinExist(TitreFenêtre)) {
PostMessage CodeMsg, ValInt, ValLarg
}
DetectHiddenWindows AncienCacheCaché
}
}
Solution de réception
Ce composant écoute les événements spécifiques pour traiter les arrivées de données. Il associe les callbacks nécessaires sans bloquer le flux principal.
#Requires AutoHotkey v2.0
; Enregistrement global du gestionnaire WM_COPYDATA
OnMessage(0x004A, CallbackRéceptionCopie)
class InterfaceRéception {
static CallbackRéceptionCopie := (Données) =>
ToolTip(A_ScriptName "`nDonnées reçues :" "$n"Données)
// Enregistrement d'un écouteur pour un code message personnalisé
statique ÉcouterMessage(CodeMessage, FonctionCallback) {
Return OnMessage(CodeMessage, FonctionCallback)
}
// Traitement interne de la copie de données entrantes
statique _Traitement_WM_COPYDATA(lParam) {
AdresseStr := NumGet(lParam, 2 * A_PtrSize, "Ptr")
ContenuBrut := StrGet(AdresseStr)
// Déclenchement asynchrone du callback pour éviter le blocage
SetTimer InterfaceRéception.CallbackRéceptionCopie.Bind(ContenuBrut), -1
Return true
}
}
; Exemple de configuration manuelle pour les paramètres
#Include ..\InterfaceRéception.ahk
cb_Prive(wPrm, lPrm, Code, *) {
MsgBox "Signal reçu `" Code "`nHauteur: " wPrm " "
"& Bas: " lPrm
}
InterfaceRéception.ÉcouterMessage(0x5555, cb_Prive)
Mise en œuvre opérationnelle
Le scénario standard consiste à démarrer l'instance réceptrice en premier pour s'assurer que les écouteurs sont actifs, puis d'initier l'envoi.
Script Destinateur
#Requires AutoHotkey v2.0
#SingleInstance Force
; Chargement de la logique de réception
#Include ..\InterfaceRéception.ahk
// Le processus doit rester en mémoire active
Persistent
// Définition du comportement par défaut sur la réception copiée
InterfaceRéception.CallbackRéceptionCopie := (Info) =>
MsgBox('Succès : "' Info '"')
// Configuration pour les messages paramétrés
cb_Standard(vW, vL, m, *) {
MsgBox "Notification entrée: " m "`nValeurs: " vW ", " vL
}
InterfaceRéception.ÉcouterMessage(0x5555, cb_Standard)
Script Émetteur
#Requires AutoHotkey v2.0
#SingleInstance Force
// Intégration de la bibliothèque d'envoi
#Include ..\CommunicateurSortant.ahk
// Envoi de texte simple
CommuneSortante.EnvoyerContenu('Destinateur', 'Test de liaison automatique')
// Envoi de valeurs numériques spécifiques
CommuneSortante.EnvoyerParamètres('Destinateur', 100, 250, 0x5555)