c# - visual - Ouverture d'un "type de fichier connu" dans l'instance en cours d'exécution de l'application personnalisée-.NET




winforms vs wpf (4)

La façon dont je le ferais est comme ceci:

  1. Première chose dans la méthode principale, vérifiez la liste de processus pour une instance existante de l'application.
  2. Si trouvé, envoyez le nom de fichier / chemin d'accès à l'instance en cours d'exécution en utilisant votre méthode de communication interprocessus préférée ( envoi de messages Windows , à distance, wcf, etc.)
  3. Fermez le nouveau processus que Windows a tenté de démarrer (puisque l'instance existante a déjà géré l'opération d'ouverture de fichier

Comment ouvrir un fichier (qui a une association de fichiers / applications connue dans le registre) dans une "instance en cours d'exécution" de l'application dans laquelle il est censé s'ouvrir? Un exemple serait, j'ai Excel ouvert et je clique sur un fichier XLS ..... le fichier s'ouvre dans l'instance Excel en cours. Je veux le faire pour une application personnalisée ... comment fonctionne le message / événement qui "indique" à l'instance actuelle qu'il doit ouvrir un fichier? Y a-t-il un "observateur de fichiers" qui cherche une requête pour le faire, etc.? Merci..



Ce que vous voulez faire est d'hériter d'une classe de WindowsFormsApplicationBase , définissant la propriété IsSingleInstance protégée sur true:

// This should all be refactored to make it less tightly-coupled, obviously.
class MyWindowsApplicationBase : WindowsFormsApplicationBase
{
  internal MyWindowsApplicationBase() : base()
  {
    // This is a single instance application.
    this.IsSingleInstance = true;

    // Set to the instance of your form to run.
    this.MainForm = new MyForm();
  }
}

La méthode Main de votre application ressemble alors à ceci:

// This should all be refactored to make it less tightly-coupled, obviously.
public static void Main(string args[])
{
  // Process the args.
  <process args here>

  // Create the application base.
  MyWindowsApplicationBase appBase = new MyWindowsApplicationBase();

  // <1> Set the StartupNextInstance event handler.
  appBase.StartupNextInstance = <event handler code>;

  // Show the main form of the app.
  appBase.Run(args);
}

Notez la section marquée <1>. Vous définissez cela avec un gestionnaire d'événements pour StartupNextInstanceEvent . Cet événement est déclenché lorsque l'instance suivante de votre application est déclenchée lorsque vous avez une application d'instance unique (que vous avez spécifiée dans le constructeur de MyWindowsApplicationBase). Le gestionnaire d'événements transmettra une classe dérivée d'EventArgs qui aura les arguments de ligne de commande que vous pourrez ensuite traiter dans l'instance en cours d'exécution de votre application.

Ensuite, tout ce que vous avez à faire est de définir les associations de fichiers normalement pour les types de fichiers que vous voulez que votre application traite, et vous êtes défini.


Exemple utilisant TCP-sockets: http://pieterjan.pro/?a=Projecten_csharp_DrawIt.php

  1. démarrer TCPListener sur le formulaire
  2. connecter TCPClient dans le principal de la deuxième instance
  3. Envoyer ActivationArguments via la connexion TCP au formulaire

Fonctionne pour plusieurs fichiers à la fois, et même pour plusieurs fichiers à la première fois (lorsque l'application n'a pas encore démarré)

Les blocs de code les plus importants sont:

  1. Le constructeur de MainForm (Hoofdscherm) où le serveur est démarré et le numéro de port est écrit dans un fichier. Le premier fichier est également ouvert.
  2. La fonction principale (Program.cs) où la deuxième, troisième, ... instance se connecte à la TcpListener dans la première instance et envoie le nom de fichier à travers le socket

Le code source est disponible sur le bouton "Broncode"





winforms