2013-08-23 4 views
1

Из моего приложения я разрешаю пользователю открывать файл справки.Проверьте, запущен ли процесс с Process.Start?

Файл справки - это только файл * .chm, который открывается с помощью справки по умолчанию.

я открываю его с помощью следующей команды

Process.Start(stringPathToTheFile); 

Вопрос заключается в том, что пользователь может щелкнуть два раза или больше в меню справки, и файл откроется, как много раз, как они щелкают.

Моя первая проблема заключается в том, что я должен убедиться, что пользователь не может открыть файл справки более чем один раз:

Я осведомлен о process.HasExcited собственности, но я не могу использовать это, потому что, если я открываю программное обеспечение , нажмите на справку, закройте мое программное обеспечение, откройте его еще раз и нажмите на ссылку, в которой я заканчиваю открытие двух файлов справки.

EDIT Похоже, что это не очень понятно, так что вот небольшой пример того, что я имею в виду.

Создание консольного приложения с этим:

, если я использую HasExited (или события), у меня будет такой код:

private static readonly Dictionary<String, Process> _startedProcess = new Dictionary<string, Process>(); 

private static void Main() 
{ 
    String file = @"c:\testFile.txt"; 
    while (true) 
    { 
     Console.ReadLine(); 
     OpenProcessIfNeeded(file); 
    } 
} 

private static void OpenProcessIfNeeded(String file) 
{ 
    if (!_startedProcess.ContainsKey(file) || _startedProcess[file].HasExited) 
    { 
     Process process = Process.Start(file); 
     _startedProcess[file] = process; 
    } 
} 

Эта работа, когда вы держите консоль приложение открыто, но если вы закроете приложение и заново его откроете, он не будет работать, поскольку _startedProcess не будет содержать этот процесс.

И я не могу найти правильный процесс с Process.GetProcesses(), потому что я не вижу никакой собственности, которая позволяет мне узнать, какой процесс он есть.

Итак, как я могу увидеть, показывает ли процесс мой файл? Я не могу выполнить поиск в процессе, так как процесс (hh.exe) можно использовать для чтения другого файла.

Мое второе желание сосредоточиться на существующем процессе, если я уже открыл этот файл.

Спасибо за вашу помощь

+0

The HTMLHelp() api очень примитивен, мало что вы можете с ним сделать и ничего не решить вашу проблему. По крайней мере, одна причина, по которой почти каждый из них отображает помощь в браузере в эти дни. –

+0

Я не уверен, как это уместно. У меня в настоящее время эта проблема с файлом справки, но это может быть одна и та же проблема с любым другим видом файла (и я не использую HtmlHelp api) – J4N

+0

Ну, если бы вы тогда решили бы хотя бы одну проблему : окно справки автоматически закрывается при выходе из основного приложения. Help.ShowHelp() в .NET –

ответ

0

я нашел способ, чтобы проверить, если один процесс имеет файл в его «CommandLine», это означает, что в настоящее время редактирования приложения:

private static void OpenProcessIfNeeded(String file) 
{ 
    using (ManagementObjectSearcher mos = new ManagementObjectSearcher("SELECT CommandLine FROM Win32_Process")) 
    { 
     foreach (ManagementObject mo in mos.Get()) 
     { 
      if (mo["CommandLine"] != null && 
       mo["CommandLine"].ToString().IndexOf(file, StringComparison.InvariantCultureIgnoreCase) > -1) 
      { 
       Console.WriteLine("Found!: " + mo["CommandLine"]); 
       return; 
      } 
     } 
    } 
    Process.Start(file); 
}