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

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

5 Solutions collect form web for “Открытие «известного типа файла» в исполняемом экземпляре настраиваемого приложения – .NET”

То, что вы хотите сделать, – наследовать 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 в первом экземпляре и отправляет имя файла через сокет

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

  • Передача данных между формами
  • Отключение анимации прогресса проекта .NET при изменении значения?
  • Проверка работы приложения Windows
  • Как определить событие EventGridView CheckBox?
  • Обнаружить изменение разрешения c # WinForms
  • Как настроить приложение для правильной работы на машине с высокой настройкой DPI (например, 150%)?
  • Скрыть кнопки TabControl для управления сложными панелями
  • Ribbon UI Control для WinForms
  • Как я могу перенести окно приложения на передний план?
  • Клиент сервера посылает / получает простой текст
  • Как отобразить форму Windows в полноэкранном режиме на панели задач?
  • Interesting Posts

    Проблемы с API-интерфейсами API Google Maps v3 + jQuery

    Как передать CustomActionData в CustomAction с помощью WiX?

    Ноутбук: если сначала подключить AC или к ноутбуку

    Как использовать инструменты: overrideLibrary в файле build.gradle?

    Как использовать java.util.Scanner, чтобы правильно читать данные пользователя из System.in и действовать на него?

    Рекурсивная итерация jQuery по объектам

    Когда использовать конструктор и когда использовать метод getInstance () (статические заводские методы)?

    Как редактировать системный / пользовательский словарь в Windows 8?

    asp.net mvc комплексная маршрутизация для пути дерева

    Разница между методами и функциями, в Python по сравнению с C ++

    Почему я не могу получить доступ к серверу MySQL с помощью правила пересылки портов в маршрутизаторе?

    Почему замораживание Chrome?

    Чтение формата ePub

    Как я могу создать автозапуск DVD?

    Доступ к глобальному массиву за пределами связанного неопределенного поведения?

    Давайте будем гением компьютера.