Я создаю приложение, которое должно открывать файлы от Explorator. Конечно, я могу сделать это с помощью args, но Explorator открывает новое приложение для каждого файла. Я хотел бы, например, отправить args в существующее приложение - не открывать новое.«Открыть с ...» в существующем виде
ответ
Проводник всегда открывает новый экземпляр вашего приложения. Что вам нужно сделать, так это контролировать, есть ли другой открытый экземпляр, и если это так, передайте ему командную строку и закройте свой новый экземпляр.
Есть некоторые классы, которые могут помочь вам в .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);
}
Я не могу использовать WindowsFormsApplicationBase, потому что мне нужно изменить код кода. Надеюсь, что есть решения без внедрения VB. – Freshek
Потому что вы должны отредактировать код всего кода? Что это должно значить? Вы вообще не внедряете VB в мое решение ... будьте более ясны, и если у вас есть конкретные требования, поставьте их на вопрос – Jcl
Я не знаю много VB. Например, Invoke не существует. У меня есть проект, который должен выполняться на C# без реализации VB. – Freshek
Вы пробовали что-нибудь вообще? Это winforms? – Jcl
Да, это winforms. – Freshek