2016-04-22 11 views
0


Я создаю приложение, которое должно открывать файлы от Explorator. Конечно, я могу сделать это с помощью args, но Explorator открывает новое приложение для каждого файла. Я хотел бы, например, отправить args в существующее приложение - не открывать новое.«Открыть с ...» в существующем виде

+0

Вы пробовали что-нибудь вообще? Это winforms? – Jcl

+0

Да, это winforms. – Freshek

ответ

1

Проводник всегда открывает новый экземпляр вашего приложения. Что вам нужно сделать, так это контролировать, есть ли другой открытый экземпляр, и если это так, передайте ему командную строку и закройте свой новый экземпляр.

Есть некоторые классы, которые могут помочь вам в .NET Framework, самым простым способом является добавление ссылки на Microsoft.VisualBasic (должно быть в GAC ... и игнорировать имя, оно работает и для C#), тогда вы может состоять из WindowsFormsApplicationBase, который выполняет весь шаблонный код для вас.

Что-то вроде:

public class SingleAppInstance : WindowsFormsApplicationBase 
{ 
    public SingleAppInstance() 
    { 
     this.IsSingleInstance = true;  
     this.StartupNextInstance += StartupNextInstance; 
    } 

    void StartupNextInstance(object sender, StartupNextInstanceEventArgs e) 
    { 
     // here's the code that will be executed when an instance 
     // is opened. 

     // the command line arguments will be in e.CommandLine 
    } 

    protected override void OnCreateMainForm() 
    { 
    // This will be your main form: i.e, the one that is in 
    // Application.Run() in your original Program.cs 
    this.MainForm = new Form1(); 
    } 
} 

Тогда в вашем Program.cs, вместо использования Application.Run, при запуске, мы делаем:

[STAThread] 
static void Main() 
{ 
    string[] args = Environment.GetCommandLineArgs(); 
    var singleApp = new SingleAppInstance(); 
    singleApp.Run(args); 
} 
+0

Я не могу использовать WindowsFormsApplicationBase, потому что мне нужно изменить код кода. Надеюсь, что есть решения без внедрения VB. – Freshek

+0

Потому что вы должны отредактировать код всего кода? Что это должно значить? Вы вообще не внедряете VB в мое решение ... будьте более ясны, и если у вас есть конкретные требования, поставьте их на вопрос – Jcl

+0

Я не знаю много VB. Например, Invoke не существует. У меня есть проект, который должен выполняться на C# без реализации VB. – Freshek