c # abre arquivo com aplicativo e parâmetros padrão

103

A maneira mais fácil de abrir um arquivo com o aplicativo padrão é:

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

Porém, gostaria de saber se existe uma maneira de definir parâmetros para o aplicativo padrão, pois gostaria de abrir um pdf em um determinado número de página.

Sei fazer criando um novo processo e configurando os parâmetros, mas assim preciso indicar o caminho da aplicação, e gostaria de ter uma aplicação portátil e não ter que definir o caminho da aplicação cada vez Eu uso o aplicativo em outro computador. Minha ideia é que espero que o computador tenha instalado o leitor de pdf e diga apenas o que abrir a página.

Obrigado.

Álvaro García
fonte
Você quer dizer enviar parâmetros para o executável da Adobe em vez do arquivo pdf, mas sem usar o caminho completo?
Bali C
2
Como você espera que isso funcione? Se você não sabe o caminho do aplicativo, não sabe qual é o visualizador de PDF padrão e não sabe qual formato de parâmetro usar.
ken2k
2
Não basta dizer myProcess.StartInfo.FileName = "Acrobat.exe";sem fornecer o caminho completo para o aplicativo?
daniloquio
1
Dê uma olhada nesta pergunta do SO para ver se ajuda
Mark Hall
2
@daniloquio: Acho que o ponto é que o OP não sabe o que o usuário final instalou em sua máquina para ler arquivos Adobe, poderia ser Acrobat, Acrobat Reader ou qualquer outro.
Surfbutler

Respostas:

43

Se você deseja que o arquivo seja aberto com o aplicativo padrão, sem especificar Acrobat ou Reader, você não pode abrir o arquivo na página especificada.

Por outro lado, se você concordar em especificar o Acrobat ou o Reader, continue lendo:


Você pode fazer isso sem informar o caminho completo do Acrobat, como este:

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();

Se você não deseja que o PDF abra com o Reader, mas com o Acrobat, altere a segunda linha assim:

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

Você pode consultar o registro para identificar o aplicativo padrão para abrir arquivos PDF e, em seguida, definir FileName no StartInfo do seu processo de acordo.

Siga esta pergunta para obter detalhes sobre como fazer isso: Encontrar o aplicativo padrão para abrir um tipo de arquivo específico no Windows

daniloquio
fonte
2
+1 Além disso, acho que é possível procurar o aplicativo associado a qualquer tipo de arquivo, por exemplo, '.pdf' no registro e, em seguida, colocar esse nome no parâmetro do nome do arquivo. Consulte stackoverflow.com/questions/162331/…
Surfbutler
Existe algum parâmetro aberto para que o Adobe Reader abra na visualização de 2 páginas? Só por curiosidade, se alguém souber, seria muito útil. Estive procurando, mas não consigo encontrar nada.
taki Martillo
18

isso deve estar perto!

public static void OpenWithDefaultProgram(string path)
{
    Process fileopener = new Process();
    fileopener.StartInfo.FileName = "explorer";
    fileopener.StartInfo.Arguments = "\"" + path + "\"";
    fileopener.Start();
}
Jessie Lesbian
fonte
1
Perfeito !
François Girard,
1
Isso funcionou para mim para abrir PDFs com o programa padrão. Obrigado!
Smitty-Werben-Jager-Manjenson
1
@imgen, a questão é fornecer o número da página como um parâmetro. Esta resposta cobre isso?
daniloquio
1
@daniloquio desculpe, não li a fundo a questão.
imgen
2
Não se esqueça de embrulhá-lo em um bloco de uso, o processo é IDisposable.
René Carannante
7

Converti o código VB na postagem do blog vinculada por xsl para C # e modifiquei um pouco:

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();
    }
}

EDIT - isso não é confiável. Consulte Encontrar o aplicativo padrão para abrir um tipo de arquivo específico no Windows .

Ohad Schneider
fonte
3

você pode tentar com

Process process = new Process();
process.StartInfo.FileName = "yourProgram.exe";
process.StartInfo.Arguments = ..... //your parameters
process.Start();
Aghilas Yakoub
fonte
-5

Por favor, adicione Configurações em Propriedades para o Projeto e faça uso delas desta forma você tem configurações limpas e fáceis de configurar que podem ser definidas como padrão

Como: Criar uma nova configuração em tempo de design

Atualização: após comentários abaixo

  1. Clique com o botão direito no projeto
  2. Adicionar novo item
  3. Em Itens do Visual C # -> Geral
  4. Selecione o arquivo de configurações
HatSoft
fonte
14
Guia errada, talvez? ;)
ken2k