Usuário com melhor resposta
Como abrir um executavel dentro de um windows form aplicattion?

Pergunta
-
Olá,
Minha dúvida e o seguinte, esto criando um Windows Form Applications, que é um Full Screen de um jogo. Porém nele eu quero fazer o seguinte, quero coloca um botão com nome "Abrir algum programa" é quando clicar em cima desse botão, aparece o programa que eu fiz. Quero coloca um arquivo .exe dentro de outro arquivo exe. Vocês poderiam me ajudar? É urgente para meu novo projeto.
Respostas
-
Você pode utilizar o SetParent como abaixo
[DllImport("user32.dll", SetLastError = true)] static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); private void button2_Click(object sender, EventArgs e) { var process = new Process(); process.StartInfo.FileName = "notepad.exe"; process.Start(); SetParent(process.MainWindowHandle, panel1.Handle); }
para remover utlize:
SetParent(process.MainWindowHandle, IntPtr.Zero);
Note que panel1 é onde você quer abrir sua aplicação.
Aqui você encontra outro exemplo:
http://www.codeproject.com/Articles/9123/Hosting-EXE-Applications-in-a-WinForm-project
- Sugerido como Resposta André de Mattos Ferraz segunda-feira, 14 de março de 2016 16:27
- Não Sugerido como Resposta André de Mattos Ferraz segunda-feira, 14 de março de 2016 16:28
- Sugerido como Resposta André de Mattos Ferraz segunda-feira, 14 de março de 2016 16:28
- Marcado como Resposta Marcos SJ segunda-feira, 14 de março de 2016 16:41
-
Pelo que pude perceber, o problema é que em máquinas diferentes, os caminhos são diferentes.
O Problema não está sendo como chamar, isso você já conseguiu na sua máquina, o problema é como padronizar o local de chamada.
Correto ?
Antero Marques
- Marcado como Resposta Marcos SJ segunda-feira, 14 de março de 2016 16:41
-
Alehandroz,
Você tem algumas opções para resolver isso.
Uma é padronizando o local de instalação num diretório raiz de uma das unidades e testar em tempo de execução em qual unidade está.
Utilizando o diretório padrão de instalação do Windows, podendo encontrar fácil assim:
Environment.SpecialFolder.ProgramFiles ou Environment.SpecialFolder.ProgramFilesX86.
Também pode setar uma variável de ambiente, como TEUAPPPATH.
Pode setar uma chave no registro.
Não importa o caminho que você vai tomar, tem que definir um método de padronização, depois que você fizer isso e tiver alguma dificuldade, pode contar conosco.
Att,
Antero Marques
- Editado Antero Marques segunda-feira, 14 de março de 2016 03:51
- Marcado como Resposta Marcos SJ segunda-feira, 14 de março de 2016 16:41
Todas as Respostas
-
-
-
Você pode utilizar o SetParent como abaixo
[DllImport("user32.dll", SetLastError = true)] static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent); private void button2_Click(object sender, EventArgs e) { var process = new Process(); process.StartInfo.FileName = "notepad.exe"; process.Start(); SetParent(process.MainWindowHandle, panel1.Handle); }
para remover utlize:
SetParent(process.MainWindowHandle, IntPtr.Zero);
Note que panel1 é onde você quer abrir sua aplicação.
Aqui você encontra outro exemplo:
http://www.codeproject.com/Articles/9123/Hosting-EXE-Applications-in-a-WinForm-project
- Sugerido como Resposta André de Mattos Ferraz segunda-feira, 14 de março de 2016 16:27
- Não Sugerido como Resposta André de Mattos Ferraz segunda-feira, 14 de março de 2016 16:28
- Sugerido como Resposta André de Mattos Ferraz segunda-feira, 14 de março de 2016 16:28
- Marcado como Resposta Marcos SJ segunda-feira, 14 de março de 2016 16:41
-
-
Alehandroz,
Nesse caso, você quer acessar uma aplicação padrão do Windows, uma sua ou uma de terceiros ?
Qual aplicação você quer chamar ?
Att,
Antero Marques
- Editado Antero Marques segunda-feira, 14 de março de 2016 01:49
-
-
Pelo que pude perceber, o problema é que em máquinas diferentes, os caminhos são diferentes.
O Problema não está sendo como chamar, isso você já conseguiu na sua máquina, o problema é como padronizar o local de chamada.
Correto ?
Antero Marques
- Marcado como Resposta Marcos SJ segunda-feira, 14 de março de 2016 16:41
-
Exato, ai pelo local ser diferentes em outras máquinas, quando clica no Button para abrir o programa não abre pelo fato de estar em um local diferente.
Caso você ainda esteja em dúvidas, eu tenho um projeto aqui semelhante ao que eu pretendo fazer que achei na internet, é posso te fornecê-lo, para você saber como eu desejo é como funciona os processos.
-
Alehandroz,
Você tem algumas opções para resolver isso.
Uma é padronizando o local de instalação num diretório raiz de uma das unidades e testar em tempo de execução em qual unidade está.
Utilizando o diretório padrão de instalação do Windows, podendo encontrar fácil assim:
Environment.SpecialFolder.ProgramFiles ou Environment.SpecialFolder.ProgramFilesX86.
Também pode setar uma variável de ambiente, como TEUAPPPATH.
Pode setar uma chave no registro.
Não importa o caminho que você vai tomar, tem que definir um método de padronização, depois que você fizer isso e tiver alguma dificuldade, pode contar conosco.
Att,
Antero Marques
- Editado Antero Marques segunda-feira, 14 de março de 2016 03:51
- Marcado como Resposta Marcos SJ segunda-feira, 14 de março de 2016 16:41
-
Antero Marques,
Fiz esse vídeo de como eu desejo o meu projeto!
Para facilitar mais o nosso processo.
Repara que eu começo iniciando um jogo .exe é nele há um button, repara que ao clicar nesse button ele abre outro arquivo .exe é assim que pretendo fazer o meu trabalho.
https://www.youtube.com/watch?v=904mXgc-PcA
Por favor, peço que você veja o vídeo para esclarecer as dúvidas
-
-
-
Olá,
Antero Marques aconteceu outro probleminha aqui é não to conseguindo entender oque é? Poderia me explicar? Como so novo no vb não consigo compreender muito.
Então quando eu inicio o aplicativo exe é clico no botão para abrir o meu executável aparece o seguinte error
"Ocorreu uma exceção sem tratamento no aplicativo. Si você clicar em Continuar, o aplicativo ignorará esse erro e tentará continuar. Se clicar em Encerrar, o aplicativo será encerrado imediatamente.
O sistema não pode encontrar o arquivo especificado."
Link da imagem do erro: http://prnt.sc/af887j
Como resolver isso ?
-
-
O caminho do arquivo é inválido. Sugiro que você utilize o debug do Visual Studio, caso aconteça na sua máquina ou então trate a Exception e de no lugar do erro você mostra a mensagem com o caminho que está sendo utilizado. Algo tipo isso:
string caminho = "..."; try { //execução do código qui... } catch (Exception ex) { MessageBox.Show("Este é o caminho:" + caminho); MessageBox.Show("Este e o erro:" + ex.ToString()); }
Depois de identificar o caminho vai ficar mais fácil encontrar o problema.
-
-
-
Olá em "seu_caminho" coloco oque? Por que o erro que tá aparecendo é na hora de eu clica no button desse código
Process.Start(My.Computer.FileSystem.SpecialDirectories.Temp & "sh.exe")
- Editado Alehandroz terça-feira, 15 de março de 2016 21:56
-
"seu_caminho" é exatamente o o que você passa como parâmetro, o My.Computer.FileSystem.SpecialDirectories.Temp & "sh.exe"
Dim caminho As String = My.Computer.FileSystem.SpecialDirectories.Temp & "sh.exe" Try Process.Start(caminho) Catch ex As Exception MsgBox("caminho:" & vbCrLf & caminho) MsgBox("Erro:" & vbCrLf & ex.Message) End Try
Seu sh.exe não existe no My.Computer.FileSystem.SpecialDirectories.Temp, este é o erro.
-
Olá Cesar Cassiano Shimanco,
Já apareceu uma pista para resolver nosso problema, apareceu esse caminho
Mais oque tenho que fazer para solucionar isso? Diz que não foi possível encontrar o arquivo especificado certo. Mais oque tenho que fazer para achar?
Eu faço tudo certo, ai creio eu que nesse caminho tem que criar um arquivo .TempNomeDoExecutavel.exe . Mais faço tudo certo é aparece esse erro na hora de da start e clico no botão
- Editado Alehandroz quarta-feira, 16 de março de 2016 11:24
-
-
-
Pelo que podemos ver no MessageBox o caminho estava incorreto por faltar uma barra antes do nome do executável (fly.exe = \fly.exe) e acredito que é isso que você corrigiu.
Quanto a não abrir... verifique no gerenciador de tarefas se o processo (fly.exe) está listado lá, se estiver, é sinal de que abriu e está rodando. Verifica também qual usuário é responsável por este processo.
-
Olhei na lista do gerenciador é não apareceu fly.exe, mais sim ele crio a pasta lá no AppLocal/Tempfly.exe que pego certo, porém esse fly.exe ele tem checkbox para poder ativar. Mais quando eu clico no botao não acontece nada não vai da pra utilizar, você saber resolver ?
-
-
Você leu o que o Cesar falou ?
Você corrigiu para que ele tente pegar o nome correto: C:\Users\JoaoCarlos\AppData\Local\Temp\fly.exe ??
Faça o seguinte teste, no lugar de usar a variável, use o caminho direto e veja se abre:
Process.Start(@"C:\Users\JoaoCarlos\AppData\Local\Temp\fly.exe")
Antero Marques
- Editado Antero Marques quinta-feira, 17 de março de 2016 22:27
-
Sim tá tudo funcionando, o problema é que quando clico no botão ele apenas cria o arquivo Tempfly.exe lá no caminho, mais não abre o executável eu clico no botão é não aparece nada, não acontece nada. Apenas cria arquivo lá na pasta AppLocal/Tempfly.exe
-
-
-
-