Открытие "известного типа файла" для запуска экземпляра пользовательского приложения - .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

Я бы сделал так:

  1. Первым делом в методе main проверьте список процессов на наличие существующего экземпляра приложения.
  2. Если найдено, отправьте имя файла / путь к уже запущенному экземпляру, используя ваш любимый метод межпроцессного взаимодействия ( отправка сообщений Windows, удаленное взаимодействие, wcf и т. Д.)
  3. Закройте новый процесс, который Windows пыталась запустить (так как существующий экземпляр уже обработал операцию открытия файла

Пример использования TCP-сокетов: http://pieterjan.pro/?a=Projecten_csharp_DrawIt.php

  1. запустить TCPListener на форме
  2. подключи TCPClient к основному второму экземпляру
  3. Отправьте ActivationArguments через TCP-соединение в форму

Также работает для нескольких файлов одновременно, и даже для нескольких файлов в первый раз (когда приложение еще не запущено)

Наиболее важные блоки кода:

  1. Конструктор MainForm (Hoofdscherm), где запускается сервер и номер порта записывается в файл. Первый файл также открыт.
  2. Main-функция (Program.cs), где второй, третий,... экземпляр подключается к TcpListener в первом экземпляре и отправляет имя файла через сокет

Исходный код доступен по кнопке "Бронкод"

Windows использует DDE для этой цели.

Динамический обмен данными (DDE) - это технология для связи между несколькими приложениями в Microsoft Windows или OS/2.

Ассоциации реестра для файлов Word или Office обычно имеют команды DDE в дополнение к обычной ассоциации файлов (которая выполняется, если приложение уже запущено).

Таким образом, вы можете разместить сервер DDE в своем приложении C# для реализации этой функциональности.

Другие вопросы по тегам