ouvrir les fichiers associés tels que ‘notepad ++ tab features’ dans WPF

Cette question concerne une application WPF. Je voudrais ouvrir des fichiers associés avec mon application personnalisée. J’ai trouvé le moyen d’ouvrir les fichiers associés. mais je ne sais pas comment gérer les applications dupliquées.

Par exemple, si je clique sur ‘a.txt2’, mon application l’ouvre. Et je clique sur ‘a2.txt2’, il ouvre également un autre processus de mon application.

Je souhaite obtenir des informations sur le second clic uniquement dans la première application, et non sur l’exécution de mon application lorsque de nombreux clics sont associés aux fichiers associés. C’est similaire au fichier ouvert ‘notepad ++‘ avec les fonctionnalités de l’onglet

Voici mes codes.

1 MainWindow.cs

public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); this.Loaded += new RoutedEventHandler(MainContainer_Loaded); } void MainContainer_Loaded(object sender, RoutedEventArgs e) { ssortingng fn = "x"; if (Application.Current.Properties["ArbitraryArgName"] != null) { fn = Application.Current.Properties["ArbitraryArgName"].ToSsortingng(); } this.Title = fn; } } 

2 app.xaml

     

3 app.cs

 public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { // Check if this was launched by double-clicking a doc. If so, use that as the // startup file name. ssortingng fname = "No filename given"; if (AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData != null && AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData.Length > 0) { try { fname = AppDomain.CurrentDomain.SetupInformation.ActivationArguments.ActivationData[0]; // It comes in as a URI; this helps to convert it to a path. Uri uri = new Uri(fname); fname = uri.LocalPath; this.Properties["ArbitraryArgName"] = fname; } catch { // For some reason, this couldn't be read as a URI. // Do what you must... } } ssortingng procName = Process.GetCurrentProcess().ProcessName; // get the list of all processes by the "procName" Process[] processes = Process.GetProcessesByName(procName); if (processes.Length > 1) { MessageBox.Show(procName + " already running"); //App a = new App(); //a.Shutdown(); } else { } MainWindow mainWindow = new MainWindow(); mainWindow.Show(); base.OnStartup(e); } } 

Merci.

utilisez la technique d’instance singleton unique inférieure qui est disponible avec l’espace de noms “Microsoft.VisualBasic”:

 using System; namespace Sample { public class Startup { [STAThread] public static void Main(ssortingng[] args) { SingleInstanceApplicationWrapper wrapper = new SingleInstanceApplicationWrapper(); wrapper.Run(args); } } public class SingleInstanceApplicationWrapper : Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase { public SingleInstanceApplicationWrapper() { // Enable single-instance mode. this.IsSingleInstance = true; } // Create the WPF application class. private WpfApp app; protected override bool OnStartup( Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e) { app = new WpfApp(); app.Run(); return false; } // Direct multiple instances protected override void OnStartupNextInstance( Microsoft.VisualBasic.ApplicationServices.StartupNextInstanceEventArgs e) { if (e.CommandLine.Count > 0) { ((MainWindow)app.MainWindow).openFile(e.CommandLine[0]); } } } public class WpfApp : System.Windows.Application { protected override void OnStartup(System.Windows.StartupEventArgs e) { base.OnStartup(e); // Load the main window. MainWindow main = new MainWindow(); this.MainWindow = main; main.Show(); // Load the document that was specified as an argument. if (e.Args.Length > 0) main.openFile(e.Args[0]); } } }