none
Como saber o nome do arquivo que chamou o executável? RRS feed

  • Pergunta

  • Eu criei um arquivo com minha própria extensão utilizando a técnica de serialização do C#. Associei a esta extensão um ícone e o arquivo executável do meu programa, assim quando eu dou um clique duplo sobre o arquivo ele chama o meu executável. Tudo funciona perfeitamente, porém quando eu dou um clique duplo no arquivo que eu criei eu quero que ele seja exibido no meu programa e para isso eu preciso saber o nome do arquivo que esta chamando o executável.

    Eu pesquisei bastante e encontrei uma duvida semelhante nesse link abaixo, 

    http://social.msdn.microsoft.com/Forums/pt-BR/vscsharppt/thread/633576e7-ebfd-47ac-8168-faabc2e12a19

    E nesse outro link eu descobri como posso fazer isso,

    http://www.c-sharpcorner.com/UploadFile/mahesh/CmdLineArgs03212006232449PM/CmdLineArgs.aspx

    Eu utilizo o código abaixo, que esta dentro do evento load do formulário, pois eu não utilizo o método Main no meu aplicativo, que deveria exibir o nome do arquivo que esta chamando o executável. Porém a única string que ele exibe é a que contem o diretório e o nome do meu executável.

    O que esta faltando para que eu possa obter o nome do arquivo que chamou o executável? Existe outra forma de fazer isso?  eu teria que inserir uma chave de registro que passa-se o nome do arquivo para o executável?

    private void frmArquivoPersonalizado_Load(object sender, EventArgs e)
            {
                InicializarControles();
                oPrincipal.Inicializar();
    
                foreach (string arg in Environment.GetCommandLineArgs())
                {
                    MessageBox.Show(arg);
                }
            }




    sábado, 21 de julho de 2012 04:11

Respostas

  • Então esse código aqui deveria funcionar.

     foreach (string arg in Environment.GetCommandLineArgs())

    O primeiro argumento sempre é o caminho do seu aplicativo, provavelmente a segunda ou terceira mensagem deve ser o arquivo que vc clicou.

    Se mesmo assim não funcionar, utilize o Main.

    static void Main(string[] args)

    A variavel args com certeza irá conter o seu arquivo, dai é só passar por parametro no construtor do formulario.

    quinta-feira, 26 de julho de 2012 14:54

Todas as Respostas

  • Então esse código aqui deveria funcionar.

     foreach (string arg in Environment.GetCommandLineArgs())

    O primeiro argumento sempre é o caminho do seu aplicativo, provavelmente a segunda ou terceira mensagem deve ser o arquivo que vc clicou.

    Se mesmo assim não funcionar, utilize o Main.

    static void Main(string[] args)

    A variavel args com certeza irá conter o seu arquivo, dai é só passar por parametro no construtor do formulario.

    quinta-feira, 26 de julho de 2012 14:54
  • Obrigado pela resposta Danimar, eu coloquei esse código no Main e mesmo assim não funcionou, tentei também utilizar o método Main sobrecarregado e quando faço isso eu não obtenho nenhuma resposta. Será que esta faltando configurar alguma chave de registro no Windows 7, as chaves que eu utilizei são as seguintes:

    //Cria uma subkey com o nome da extensão do aplicativo 
                Registry.ClassesRoot.CreateSubKey(extensao);
                Registry.SetValue(@"HKEY_CLASSES_ROOT\" + extensao, "", "ArquivoPersonalizado" +
                    extensao.Substring(1), RegistryValueKind.String);
    
                //Cria uma subkey com o nome do aplicativo
                Registry.ClassesRoot.CreateSubKey("ArquivoPersonalizado" + extensao.Substring(1));
                Registry.SetValue(@"HKEY_CLASSES_ROOT\ArquivoPersonalizado" + extensao.Substring(1), "",
                    "ArquivoPersonalizado", RegistryValueKind.String);
    
                //Cria uma subkey com o id do aplicativo
                Registry.ClassesRoot.CreateSubKey(@"ArquivoPersonalizado" + extensao.Substring(1) + @"\CLSID");
                Registry.SetValue(@"HKEY_CLASSES_ROOT\ArquivoPersonalizado" + extensao.Substring(1) + @"\CLSID", "",
                    "{EDSON" + extensao.Substring(1) + "-0000-0000-0000-000000000001}", RegistryValueKind.String);
    
                //Cria a subkey que configura o icone do aplicativo
                Registry.ClassesRoot.CreateSubKey(@"ArquivoPersonalizado" + extensao.Substring(1) + @"\DefaultIcon");
                Registry.SetValue(@"HKEY_CLASSES_ROOT\ArquivoPersonalizado" + extensao.Substring(1) +
                    @"\DefaultIcon", "", Environment.GetFolderPath(Environment.SpecialFolder.MyPictures) +
                    @"\Icones\Icones de Programas\AAS.ico");
    
                //Cria a subkey que abre o aplicativo
                Registry.ClassesRoot.CreateSubKey(@"ArquivoPersonalizado" + extensao.Substring(1) +
                    @"\Shell\Open\Command");
                Registry.SetValue(@"HKEY_CLASSES_ROOT\ArquivoPersonalizado" + extensao.Substring(1) +
                    @"\Shell\Open\Command", "", System.IO.Directory.GetCurrentDirectory() +
                    @"\Arquivo.Personalizado.exe", RegistryValueKind.String);
    
     Registry.CurrentUser.CreateSubKey(@"Software\Industrias Ederson");
                Registry.CurrentUser.CreateSubKey(@"Software\Industrias Ederson\ArquivoPersonalizado");
                Registry.CurrentUser.CreateSubKey(@"Software\Industrias Ederson\ArquivoPersonalizado\1.0.0.0");
                Registry.SetValue(@"HKEY_CURRENT_USER\Software\Industrias Ederson\ArquivoPersonalizado\1.0.0.0", "",
                  "{EDSON" + extensao.Substring(1) + "-0000-0000-0000-000000000001}", RegistryValueKind.String);
    
     Registry.LocalMachine.CreateSubKey(@"Software\Industrias Ederson");
                Registry.LocalMachine.CreateSubKey(@"Software\Industrias Ederson\ArquivoPersonalizado");
                Registry.LocalMachine.CreateSubKey(@"Software\Industrias Ederson\ArquivoPersonalizado\1.0.0.0");
                Registry.SetValue(@"HKEY_LOCAL_MACHINE\Software\Industrias Ederson\ArquivoPersonalizado\1.0.0.0", "",
                  "{EDSON" + extensao.Substring(1) + "-0000-0000-0000-000000000001}", RegistryValueKind.String);
    
                Registry.LocalMachine.CreateSubKey(@"Software\Classes\" + extensao);
                Registry.SetValue(@"HKEY_LOCAL_MACHINE\Software\Classes\" + extensao, "", "ArquivoPersonalizado" +
                    extensao.Substring(1), RegistryValueKind.String);


    quinta-feira, 26 de julho de 2012 18:33
  • Se vc clica no seu arquivo, e ele está chamando o seu exe, então o registro está certo.

    static void Main(string[] args)

    Chame

    Console.WriteLine(args[0]);

    Console.WriteLine(args[1]);

    Console.WriteLine(args[2]);

    quinta-feira, 26 de julho de 2012 19:10
  • Consegui encontra o problema, estava faltando criar uma chave de registro em LOCAL_MACHINE, eu estava criando apenas chaves em CLASSES_ROOT, agora tanto o método static void Main(string[] args) quanto o método Environment.GetCommandLineArgs() retornam o nome do arquivo que eu cliquei. Abaixo coloquei todas as chaves que eu utilizei caso alguém precise.

     private void ClassesRoot()
            {
                //Cria uma subkey com o nome da extensão do aplicativo 
                Registry.ClassesRoot.CreateSubKey(extensao);
                Registry.SetValue(@"HKEY_CLASSES_ROOT\" + extensao, "", "ArquivoPersonalizado", 
                    RegistryValueKind.String);
    
                //Cria uma subkey com o nome do aplicativo
                Registry.ClassesRoot.CreateSubKey("ArquivoPersonalizado");
                Registry.SetValue(@"HKEY_CLASSES_ROOT\ArquivoPersonalizado", "", "ArquivoPersonalizado", 
                    RegistryValueKind.String);
    
                //Cria uma subkey com o id do aplicativo
                Registry.ClassesRoot.CreateSubKey(@"ArquivoPersonalizado\CLSID");
                Registry.SetValue(@"HKEY_CLASSES_ROOT\ArquivoPersonalizado\CLSID", "",
                    "{EDSON" + extensao.Substring(1) + "-0000-0000-0000-000000000001}", RegistryValueKind.String);
    
                //Cria a subkey que configura o icone do aplicativo
                Registry.ClassesRoot.CreateSubKey(@"ArquivoPersonalizado\DefaultIcon");
                Registry.SetValue(@"HKEY_CLASSES_ROOT\ArquivoPersonalizado\DefaultIcon", "", 
                    Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) +
                    @"\Meus Documentos\Icones\Icones de Programas\AAS.ico", RegistryValueKind.String);
    
                //Cria a subkey que abre o aplicativo
                Registry.ClassesRoot.CreateSubKey(@"ArquivoPersonalizado\Shell\Open\Command");
                Registry.SetValue(@"HKEY_CLASSES_ROOT\ArquivoPersonalizado\Shell\Open\Command", "", 
                    Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) +
                    @"\C#\Arquivo.Personalizado\Arquivo.Personalizado\bin\Release\Arquivo.Personalizado.exe ""%1""", 
                    RegistryValueKind.String);      
            }//ClassesRoot()
    
            private void CurrentUser()
            {
                Registry.CurrentUser.CreateSubKey(@"Software\Industrias Ederson");
                Registry.CurrentUser.CreateSubKey(@"Software\Industrias Ederson\ArquivoPersonalizado");
                Registry.CurrentUser.CreateSubKey(@"Software\Industrias Ederson\ArquivoPersonalizado\1.0.0.0");
                Registry.SetValue(@"HKEY_CURRENT_USER\Software\Industrias Ederson\ArquivoPersonalizado\1.0.0.0", "",
                  "{EDSON" + extensao.Substring(1) + "-0000-0000-0000-000000000001}", RegistryValueKind.String);
            }//CurrentUser()
    
            private void LocalMachine()
            {
                Registry.LocalMachine.CreateSubKey(@"Software\Classes\" + extensao);
                Registry.LocalMachine.SetValue(@"HKEY_LOCAL_MACHINE\Software\Classes\" + extensao, 
                    "ArquivoPersonalizado", RegistryValueKind.String);
    
                //Cria uma subkey com o nome do aplicativo
                Registry.LocalMachine.CreateSubKey(@"Software\Classes\ArquivoPersonalizado");
                Registry.SetValue(@"HKEY_LOCAL_MACHINE\Software\Classes\ArquivoPersonalizado", "",
                    "ArquivoPersonalizado", RegistryValueKind.String);
    
                //Cria uma subkey com o id do aplicativo
                Registry.LocalMachine.CreateSubKey(@"Software\Classes\ArquivoPersonalizado\CLSID");
                Registry.SetValue(@"HKEY_LOCAL_MACHINE\Software\Classes\ArquivoPersonalizado\CLSID", "",
                    "{EDSON" + extensao.Substring(1) + "-0000-0000-0000-000000000001}", RegistryValueKind.String);
    
                //Cria a subkey que configura o icone do aplicativo
                Registry.LocalMachine.CreateSubKey(@"Software\Classes\ArquivoPersonalizado\DefaultIcon");
                Registry.SetValue(@"HKEY_LOCAL_MACHINE\Software\Classes\ArquivoPersonalizado\DefaultIcon", "",
                    Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) +
                    @"\Meus Documentos\Icones\Icones de Programas\AAS.ico", RegistryValueKind.String);
    
                //Cria a subkey que abre o aplicativo
                Registry.LocalMachine.CreateSubKey(@"Software\Classes\ArquivoPersonalizado\Shell\Open\Command");
                Registry.SetValue(@"HKEY_LOCAL_MACHINE\Software\Classes\ArquivoPersonalizado\Shell\Open\Command", "",
                    Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) +
                    @"\C#\Arquivo.Personalizado\Arquivo.Personalizado\bin\Release\Arquivo.Personalizado.exe ""%1""",
                    RegistryValueKind.String);      
    
                Registry.LocalMachine.CreateSubKey(@"Software\Industrias Ederson");
                Registry.LocalMachine.CreateSubKey(@"Software\Industrias Ederson\ArquivoPersonalizado");
                Registry.LocalMachine.CreateSubKey(@"Software\Industrias Ederson\ArquivoPersonalizado\1.0.0.0");
                Registry.SetValue(@"HKEY_LOCAL_MACHINE\Software\Industrias Ederson\ArquivoPersonalizado\1.0.0.0", "",
                  "{EDSON" + extensao.Substring(1) + "-0000-0000-0000-000000000001}", RegistryValueKind.String);
            }//LocalMachine()
    

    sexta-feira, 27 de julho de 2012 18:05
  • Boa Noite Pessoal,

    Tenho que faze a mesma coisa que Edson, porém quando o nome do meu arquivo está separado por exemplo "Teste Teste.extensão" o meu 

    foreach (string arg in Environment.GetCommandLineArgs())

    retorna o nome picado diretório\Teste depois Teste.extensão.

    Estou fazendo meu registro com o instalador. Alguém sabe se é assim mesmo ou tem algum problema?

    Obrigado

    sexta-feira, 14 de dezembro de 2012 01:12