2017-07-28 8 views
2

Je veux déclencher un événement dans mon application en cours d'exécution et de fournir des arguments à l'appel d'un schéma d'URL dans Windows 10. J'ai fait l'entrée de Registre suivante:système de Windows URL appel à programme en cours d'exécution

HKEY_CLASSES_ROOT 
alert 
    (Default) = "URL:Alert Protocol" 
    URL Protocol = "" 
    DefaultIcon 
     (Default) = "alert.exe,1" 
    shell 
     open 
      command 
       (Default) = "C:\Program Files\Alert\alert.exe" "%1" 

Il est évident que , cela démarre toujours une nouvelle instance de mon application avec un argument, en appelant 'alert: arg1'. Mais je veux que Windows appelle mon instance déjà en cours d'exécution.

Avec Mac, l'appel de ce schéma d'URL déclenche un événement, je peux attraper. Exactement, comme je le veux. Pour ce faire, j'ai ajouté la partie suivante à alert.app/Contents/Info.plist:

<array> 
    <dict> 
    <key>CFBundleURLName</key> 
    <string>Alert</string> 
    <key>CFBundleURLSchemes</key> 
    <array> 
      <string>alert</string> 
    </array> 
    </dict> 
</array> 

Alors, comment puis-je réaliser cela sur Windows? Je programme cette application dans XOJO avec BASIC orienté objet, mais je serai content d'une solution générale.

+0

Windows relance simplement l'exécutable afin que votre question soit vraiment "comment faire IPC sous Windows". Je ne sais pas ce que vous empilez mais cela est généralement accompli en demandant à l'exe de créer un mutex nommé quand il se charge, s'il ne peut pas savoir qu'une autre instance de lui-même est en cours d'exécution à quel point il utilise un mécanisme IPC transmettre sa ligne de commande, en envoyant par-dessus un tuyau nommé par exemple. –

+0

Faites de votre application une instance unique (de facto, utilisez un Mutex) et envoyez un message de l'instance nouvellement démarrée à l'instance déjà en cours, puis quittez. – CodeCaster

+0

Merci à Alex et CodeCaster de m'avoir conduit de la bonne façon. Avec cette information j'ai trouvé un bon article avec le code de travail et l'ai posté comme réponse. –

Répondre

1

Eh bien, après avoir lu la réponse d'Alex, j'ai cherché comment réaliser cela avec du code et trouvé un solution de Brad Smith écrit en C#.

L'entrée de Registre ci-dessus peut rester tel qu'il est, mais le programme a besoin aussi:

  • Une classe de service (qui est exposé par l'instance d'application
    via .NET Remoting)
  • A point d'entrée modifié (qui communiquera avec le service puis se terminera, ou démarrera normalement l'application)

Lisez son article et regardez son code pour plus d'explications.