Existe-t-il un moyen de forcer une application sur Windows à être une application à instance unique, c'est-à-dire de ne pas se lancer si une autre instance de la même application est déjà en cours d'exécution ? Idéalement, je voudrais pouvoir faire cela sans avoir besoin de remplacer l'application réelle par un faux, mais je ne me dérangerais pas d'en utiliser un si vraiment nécessaire.
Réponses
Trop de publicités?Normalement, vous devez implémenter cette fonction "singleton" directement dans l'application. si vous souhaitez la protéger "de l'extérieur", vous devez utiliser un wrapper qui vérifie s'il existe déjà une autre instance en cours d'exécution. il existe peut-être d'autres solutions à cela, mais j'ai déjà réussi à le faire avec nsis. l'idée est la suivante :
- créez un "faux installateur" qui n'est en réalité qu'un petit wrapper autour de l'application que vous souhaitez démarrer
- faites de cet installateur un singleton, voir ici http://nsis.sourceforge.net/Allow_only_one_installer_instance ou http://nsis.sourceforge.net/Check_whether_your_application_is_running
- démarrez votre application à partir de cet "installateur wrapper", voir ici http://nsis.sourceforge.net/ExecCmd_plug-in
- "cachez" l'icône habituelle de l'application à l'utilisateur et présentez ce faux installateur. étant donné que vous pouvez lui ajouter une icône attrayante, vous devriez pouvoir le faire ressembler au programme d'origine.
Sauf s'il existe une solution de contournement que vous pouvez appliquer avec le Kit de compatibilité des applications qui le permet – ce dont je doute (ce n'est pas le genre de chose qui enfreint la compatibilité1) – alors il n'y a aucun paramètre dans Windows.
En dehors d'une application de lancement, l'autre approche serait de surveiller les nouveaux processus (par exemple, les événements de création d'instance WMI pour les objets Win32_Process
– bien sûr filtrés par session) et d'effectuer une action pour bloquer la deuxième instance.
1 Bien entendu, une correction pourrait être nécessaire si une application utilise un mécanisme non pris en charge pour détecter plusieurs instances d'elle-même, de sorte que le mécanisme de détection ait besoin d'un shim.