Usuário com melhor resposta
Como saber o nome do arquivo que chamou o executável?

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); } }
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.
- Marcado como Resposta Edson Rodrigues da Silva sexta-feira, 27 de julho de 2012 17:55
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.
- Marcado como Resposta Edson Rodrigues da Silva sexta-feira, 27 de julho de 2012 17:55
-
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);
- Editado Edson Rodrigues da Silva quinta-feira, 26 de julho de 2012 18:35
-
-
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()
-
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