Открытие «известного типа файла» в исполняемом экземпляре настраиваемого приложения – .NET

Как вы можете открыть файл (имеющий известную ассоциацию файлов и приложений в реестре) в «запущенный экземпляр» приложения, в котором он должен быть открыт? Например, я открываю Excel и нажимаю на файл XLS … файл открывается в текущем экземпляре Excel. Я хочу сделать это для настраиваемого приложения … как работает событие / сообщение, которое «сообщает» текущему экземпляру, что ему нужно открыть файл? Есть ли «наблюдатель файлов», который ищет запрос для этого и т. Д.? Благодаря..

То, что вы хотите сделать, – наследовать class из 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(); } } 

Основной метод вашего приложения выглядит следующим образом:

 // This should all be refactored to make it less tightly-coupled, obviously. public static void Main(string args[]) { // Process the args.  // Create the application base. MyWindowsApplicationBase appBase = new MyWindowsApplicationBase(); // <1> Set the StartupNextInstance event handler. appBase.StartupNextInstance = ; // Show the main form of the app. appBase.Run(args); } 

Обратите внимание на раздел с меткой <1>. Вы устанавливаете это с помощью обработчика событий для StartupNextInstanceEvent . Это событие запускается, когда следующий экземпляр вашего приложения запускается, когда у вас есть одно приложение-экземпляр (которое вы указали в конструкторе MyWindowsApplicationBase). Обработчик события передаст class, созданный EventArgs, который будет иметь аргументы командной строки, которые вы затем можете обработать в исполняемом экземпляре вашего приложения.

Затем все, что вам нужно сделать, это установить ассоциации файлов обычно для типов файлов, которые вы хотите, чтобы ваше приложение обрабатывалось, и вы настроены.

Похоже, что вы ищете создание одного экземпляра приложения. Это можно сделать в C # с помощью WindowsFormsApplicationBase, расположенной в Microsoft.VisualBasic.dll

Для получения дополнительной информации см. http://www.hanselman.com/blog/TheWeeklySourceCode31SingleInstanceWinFormsAndMicrosoftVisualBasicdll.aspx или поиск WindowsFormsApplicationBase

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

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

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

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

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

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

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

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

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

Наиболее важными кодовыми блоками являются:

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

Исходный код доступен на кнопке «Бронкод»,

  • Внедрение MVC с помощью Windows Forms
  • Нарисуйте несколько рисунков полилинии или кривых свободной руки - добавление функции отмены
  • Как мне зарегистрироваться на C # без использования сторонних библиотек?
  • c #, 'Forms' не существует в пространстве имен system.windows
  • Как отправить электронное письмо по умолчанию?
  • Как сделать два прозрачных слоя с помощью c #?
  • Как создавать и подключать пользовательские кнопки / элементы управления с линиями, используя формы окон
  • Как отключить узел TreeView WinForms?
  • ComboBox: добавление текста и значения в элемент (без источника привязки)
  • Бесплатный / открытый редактор исходного кода. Интерфейс пользовательского интерфейса для .Net
  • DataGridView с использованием SortableBindingList
  • Давайте будем гением компьютера.