c # открыть файл с приложением и параметрами по умолчанию

105

Самый простой способ открыть файл с помощью приложения по умолчанию:

System.Diagnostics.Process.Start(@"c:\myPDF.pdf");

Однако я хотел бы знать, существует ли способ установить параметры для приложения по умолчанию, потому что я хотел бы открыть PDF-файл с определенным номером страницы.

Я знаю, как это сделать, создав новый процесс и установив параметры, но в этом случае мне нужно указать путь к приложению, и я хотел бы иметь портативное приложение, и мне не приходилось каждый раз указывать путь к приложению. Пользуюсь приложением на другом компьютере. Моя идея состоит в том, что я ожидаю, что на компьютере установлена ​​программа для чтения PDF-файлов, и говорю только, что открывать.

Спасибо.

Альваро Гарсия
источник
Вы имеете в виду отправить параметры в исполняемый файл Adobe, а не в файл pdf, но без использования полного пути?
Bali C
2
Как вы ожидаете, что это сработает? Если вы не знаете путь к приложению, вы не знаете, какая программа просмотра PDF используется по умолчанию, и вы не знаете, какой формат параметров использовать.
ken2k 06
2
Разве недостаточно сказать, myProcess.StartInfo.FileName = "Acrobat.exe";не указав полный путь к приложению?
daniloquio 06
1
Взгляните на этот вопрос SO, чтобы убедиться, что он помогает
Марк Холл
2
@daniloquio: Я думаю, дело в том, что OP не знает, что конечный пользователь установил на своей машине для чтения файлов Adobe, это может быть Acrobat, Acrobat Reader или что-то еще.
Surfbutler 06

Ответы:

46

Если вы хотите, чтобы файл открывался в приложении по умолчанию, я имею в виду, что без указания Acrobat или Reader вы не сможете открыть файл на указанной странице.

С другой стороны, если вы согласны с указанием Acrobat или Reader, продолжайте читать:


Вы можете сделать это, не сообщая полный путь Acrobat, например:

Process myProcess = new Process();    
myProcess.StartInfo.FileName = "acroRd32.exe"; //not the full application path
myProcess.StartInfo.Arguments = "/A \"page=2=OpenActions\" C:\\example.pdf";
myProcess.Start();

Если вы хотите, чтобы PDF-файл открывался не в Reader, а в Acrobat, измените вторую строку следующим образом:

myProcess.StartInfo.FileName = "Acrobat.exe";

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

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

Данилоквио
источник
2
+1 Также я думаю, что можно найти в реестре приложение, связанное с любым типом файла, например, '.pdf', а затем указать это имя в параметре имени файла. См stackoverflow.com/questions/162331/...
Surfbutler
Есть ли какой-нибудь открытый параметр, чтобы Adobe reader открывался в двухстраничном режиме? Просто любопытно, если кто-то знает, это было бы действительно полезно. Я искал, но ничего не нашел.
taki Martillo
20

это должно быть близко!

public static void OpenWithDefaultProgram(string path)
{
    Process fileopener = new Process();
    fileopener.StartInfo.FileName = "explorer";
    fileopener.StartInfo.Arguments = "\"" + path + "\"";
    fileopener.Start();
}
Джесси Лесби
источник
1
Отлично !
Francois Girard
1
Это сработало для меня при открытии PDF-файлов с программой по умолчанию. Спасибо!
Смитти-Вербен-Ягер-Мандженсон,
1
@imgen вопрос заключается в предоставлении номера страницы в качестве параметра. Покрывает ли этот ответ это?
daniloquio
1
@daniloquio извините, я недостаточно глубоко прочитал вопрос.
imgen
3
Не забудьте обернуть его в блок using, процесс IDisposable.
Рене Караннанте
7

Я преобразовал код VB в сообщении блога, связанном с xsl, на C # и немного изменил его:

public static bool TryGetRegisteredApplication(
                     string extension, out string registeredApp)
{
    string extensionId = GetClassesRootKeyDefaultValue(extension);
    if (extensionId == null)
    {
        registeredApp = null;
        return false;
    }

    string openCommand = GetClassesRootKeyDefaultValue(
            Path.Combine(new[] {extensionId, "shell", "open", "command"}));

    if (openCommand == null)
    {
        registeredApp = null;
        return false;
    }

    registeredApp = openCommand
                     .Replace("%1", string.Empty)
                     .Replace("\"", string.Empty)
                     .Trim();
    return true;
}

private static string GetClassesRootKeyDefaultValue(string keyPath)
{
    using (var key = Registry.ClassesRoot.OpenSubKey(keyPath))
    {
        if (key == null)
        {
            return null;
        }

        var defaultValue = key.GetValue(null);
        if (defaultValue == null)
        {
            return null;
        }

        return defaultValue.ToString();
    }
}

РЕДАКТИРОВАТЬ - это ненадежно. См. Раздел Поиск приложения по умолчанию для открытия определенного типа файла в Windows .

Охад Шнайдер
источник
3

вы можете попробовать с

Process process = new Process();
process.StartInfo.FileName = "yourProgram.exe";
process.StartInfo.Arguments = ..... //your parameters
process.Start();
Агилас Якоуб
источник
-5

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

Как: создать новую настройку во время разработки

Обновление: после комментариев ниже

  1. Щелкните правой кнопкой мыши проект
  2. Добавить новый элемент
  3. В разделе Visual C # Items -> General
  4. Выберите файл настроек
HatSoft
источник
14
Может быть, не та вкладка? ;)
ken2k 06