Открытие "известного типа файла" для запуска экземпляра пользовательского приложения - .NET
Как бы вы открыли файл (который имеет известную ассоциацию файлов / приложений в реестре) в "работающем экземпляре" приложения, в котором он должен открываться? Например, у меня открыт Excel и я нажимаю на файл XLS..... файл открывается в текущем экземпляре Excel. Я хочу сделать это для пользовательского приложения... как работает обработка событий / сообщений, которая "сообщает" текущему экземпляру, что ему нужно открыть файл? Есть ли "наблюдатель за файлами", который ищет запрос и т. Д.? Спасибо..
5 ответов
Что вы хотите сделать, это унаследовать класс от WindowsFormsApplicationBase, установив для защищенного свойства IsSingleInstance значение 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();
}
}
Метод Main вашего приложения выглядит следующим образом:
// 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);
}
Обратите внимание на раздел, помеченный <1>. Вы устанавливаете это с помощью обработчика событий для StartupNextInstanceEvent. Это событие вызывается, когда запускается следующий экземпляр вашего приложения, когда у вас есть приложение с одним экземпляром (которое вы указали в конструкторе MyWindowsApplicationBase). Обработчик события будет передавать производный от EventArgs класс, который будет иметь аргументы командной строки, которые затем можно обработать в работающем экземпляре вашего приложения.
Затем все, что вам нужно сделать, это установить ассоциации файлов, как правило, для типов файлов, которые вы хотите, чтобы ваше приложение обрабатывало, и все готово.
Похоже, что вы ищете создание одного экземпляра приложения. Это можно сделать в C# с помощью WindowsFormsApplicationBase, расположенной в Microsoft.VisualBasic.dll
Для получения дополнительной информации, посмотрите на: http://www.hanselman.com/blog/TheWeeklySourceCode31SingleInstanceWinFormsAndMicrosoftVisualBasicdll.aspx или найдите WindowsFormsApplicationBase
Я бы сделал так:
- Первым делом в методе main проверьте список процессов на наличие существующего экземпляра приложения.
- Если найдено, отправьте имя файла / путь к уже запущенному экземпляру, используя ваш любимый метод межпроцессного взаимодействия ( отправка сообщений Windows, удаленное взаимодействие, wcf и т. Д.)
- Закройте новый процесс, который Windows пыталась запустить (так как существующий экземпляр уже обработал операцию открытия файла
Пример использования TCP-сокетов: http://pieterjan.pro/?a=Projecten_csharp_DrawIt.php
- запустить TCPListener на форме
- подключи TCPClient к основному второму экземпляру
- Отправьте ActivationArguments через TCP-соединение в форму
Также работает для нескольких файлов одновременно, и даже для нескольких файлов в первый раз (когда приложение еще не запущено)
Наиболее важные блоки кода:
- Конструктор MainForm (Hoofdscherm), где запускается сервер и номер порта записывается в файл. Первый файл также открыт.
- Main-функция (Program.cs), где второй, третий,... экземпляр подключается к TcpListener в первом экземпляре и отправляет имя файла через сокет
Исходный код доступен по кнопке "Бронкод"
Windows использует DDE для этой цели.
Динамический обмен данными (DDE) - это технология для связи между несколькими приложениями в Microsoft Windows или OS/2.
Ассоциации реестра для файлов Word или Office обычно имеют команды DDE в дополнение к обычной ассоциации файлов (которая выполняется, если приложение уже запущено).
Таким образом, вы можете разместить сервер DDE в своем приложении C# для реализации этой функциональности.