Gestion de l'interopérabilité et échange de messages entre scripts AutoHotkey v2

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)

Étiquettes: AutoHotkey-V2 Windows-API Interproc-Communication Gestion-Messages

Publié le 19 août à 16h24