Открытие «известного типа файла» для запуска экземпляра пользовательского приложения - PullRequest
8 голосов
/ 08 января 2009

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

Ответы [ 5 ]

14 голосов
/ 08 января 2009

Что вы хотите сделать, это унаследовать класс от 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.
  <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 . Это событие вызывается, когда запускается экземпляр next вашего приложения, когда у вас есть приложение с одним экземпляром (которое вы указали в конструкторе MyWindowsApplicationBase). Обработчик события будет передавать производный от EventArgs класс, который будет иметь аргументы командной строки, которые затем можно обработать в работающем экземпляре вашего приложения.

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

3 голосов
/ 08 января 2009

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

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

2 голосов
/ 08 января 2009

Как бы я это сделал, это так:

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

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

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

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

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

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

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

0 голосов
/ 08 января 2009

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...