Υποψιάζομαι ότι υπάρχει μία παρανόηση σχετικά με το τί κάνει η εφαρμογή, τί κάνει ο Explorer και πως περνάς παραμέτρους σε ένα πρόγραμμα.
Όταν κάνεις διπλό κλικ σε ένα αρχείο ο Explorer ψάχνει να βρει με βάση την κατάληξη του αρχείου αν έχει οριστεί κάποιο πρόγραμμα το οποίο μπορεί να το ανοίξει. Όταν το βρει το εκτελεί και περνάει σε αυτό ως πρώτη παράμετρο το όνομα του αρχείου. Όταν εσύ κάνεις διπλό κλικ σε άλλο αρχείο θα γίνει ακριβώς το ίδιο και ο explorer θα ξεκινήσει ένα δεύτερο instance.
Το ερώτημα σου στην πραγματικότητα είναι δύο ερωτήματα: Πως μπορώ να αποφύγω την εκτέλεση του δεύτερου instance και πως μπορώ να περάσω το όνομα του δεύτερου αρχείου στο πρώτο instance. Ευτυχώς, ο Scott Hanselman περιγράφει πως να λύσεις και τα δύο χρησιμοποιώντας το Microsoft.VisualBasic.dll και 10-15 γραμμές κώδικα. Ο κώδικας λέει στα Windows ότι θα υπάρχει μόνο ένα instance της εφαρμογής τη φορά. Όταν δοκιμάσεις να σηκώσεις το δεύτερο instance τα Windows θα ειδοποιήσουν το πρώτο δίνοντας ως παράμετρο το αρχείο που έκανες double click. Ο κώδικας είναι ο παρακάτω. Ουσιαστικά αντικαθιστάς την Application.Run με την SingleInstanceController.Run και ... καθάρισες:
using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;
namespace SuperSingleInstance
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
string[] args = Environment.GetCommandLineArgs();
SingleInstanceController controller = new SingleInstanceController();
controller.Run(args);
}
}
public class SingleInstanceController : WindowsFormsApplicationBase
{
public SingleInstanceController()
{
IsSingleInstance = true;
StartupNextInstance += this_StartupNextInstance;
}
void this_StartupNextInstance(object sender, StartupNextInstanceEventArgs e)
{
Form1 form = MainForm as Form1; //My derived form type
form.LoadFile(e.CommandLine[1]);
}
protected override void OnCreateMainForm()
{
MainForm = new Form1();
}
}
}
Παναγιώτης Καναβός, Freelancer
Twitter: http://www.twitter.com/pkanavos