Usuário com melhor resposta
Fechar vários Forms de uma unica vez em C#

Pergunta
-
Olá Pessoal,
Preciso de uma ajuda.
Tenho uma aplicação em C# e existem algumas botões que abrem outras telas de projetos diferentes em C#.
Necessito que quando fechar o form principal, feche todos esses outros projetos abertos.
Alguém sabe me dizer como faço isso ? Me disseram que posso fazer com o process, mas não estou conseguindo fazer.
Se puderem me ajudar agradeço.
Abs,
Jaqueline
Se ajudei? Marque como util.. Obrigado :D
- Movido Rui Santos quinta-feira, 6 de fevereiro de 2014 17:42
Respostas
-
Rui consegui resolver, o código fica assim:
No C# Classe Principal
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Diagnostics;
namespace TF.FinalizaAplicacao
{
public partial class FinalizaAplicacao : Form
{
private Process[] processes;
public FinalizaAplicacao(string vSistema)
{
InitializeComponent();
pFinaliza(vSistema);
Environment.Exit(0);
}
private void pFinaliza(string Sistema)
{
processes = Process.GetProcessesByName(Sistema);
foreach (Process proc in processes)
{
proc.CloseMainWindow();
proc.WaitForExit();
}
}
}
}No C# Classe Program
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace TF.FinalizaAplicacao
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(String[] args)
{
// SISTEMA
string Sistema = args[0];
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FinalizaAplicacao(Sistema));
}
}
}
CHAMADA NO VB
vSistema = """Formulario.EnviarEmail"""
Shell "C:\TF.FinalizaAplicacao.exe " & vSistema
Se ajudei? Marque como util.. Obrigado :D
- Marcado como Resposta Jaqueline Rodrigues quinta-feira, 6 de fevereiro de 2014 19:35
Todas as Respostas
-
Oi Jaqueline,
Na sua classe Program, você pode declara um evento ApplicarionExit na sua classe Application, para executar operações na finalização do programa.
Para identificar os forms abertos pela aplicação tem a propriedade Application.OpenForms.
Um exemplo de como poderia ser feito:
using System; using System.Windows.Forms; namespace WindowsFormsApplication1 { static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.ApplicationExit += new EventHandler(Application_ApplicationExit); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } static void Application_ApplicationExit(object sender, EventArgs e) { foreach (Form forms in Application.OpenForms) { forms.Close(); } } } }
Microsoft Community Contributor
-
Não deu certo, não fecha nenhuma...
No caso preciso passar o nome dos projetos que quero fechar.
Sistemas é o nome da variável que vai receber o projeto a ser fechado.
namespace TF.FinalizaProcesso
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(String[] args)
{
// EmailPara
string Sistema = args[0];
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FinalizaProcesso(Sistema));
}
}
}Se ajudei? Marque como util.. Obrigado :D
-
Ah desculpe... processos externos... falha minha...
Acredito que o correto seja esse:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Windows.Forms; namespace WindowsFormsApplication1 { static class Program { static IList<Process> Processos = new List<Process>(); /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.ApplicationExit += new EventHandler(Application_ApplicationExit); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } public static void ExecutarProcessoExterno(string file) { var extenal = Process.Start(file); Program.Processos.Add(extenal); } static void Application_ApplicationExit(object sender, EventArgs e) { foreach (var processo in Program.Processos) { processo.Kill(); } } } }
Microsoft Community Contributor
-
Uma pequena correção, verificar se o processo já não foi concluído anteriormente:
using System; using System.Collections.Generic; using System.Diagnostics; using System.Windows.Forms; namespace WindowsFormsApplication1 { static class Program { static IList<Process> Processos = new List<Process>(); /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.ApplicationExit += new EventHandler(Application_ApplicationExit); Program.ExecutarProcessoExterno(@"D:\Tools\Developement\Ultra Edit\uedit32.exe"); Program.ExecutarProcessoExterno(@"D:\Tools\Developement\Ultra Edit\uedit32.exe"); Program.ExecutarProcessoExterno(@"D:\Tools\Developement\Ultra Edit\uedit32.exe"); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } public static void ExecutarProcessoExterno(string file) { var extenal = Process.Start(file); Program.Processos.Add(extenal); } static void Application_ApplicationExit(object sender, EventArgs e) { foreach (var processo in Program.Processos) { if (processo.HasExited == false) processo.Kill(); } } } }
Microsoft Community Contributor
-
Você ainda podeia usar o método Process.GetProcessesByName, mas da forma q sugeri você tem certeza que esta encerrando apenas os processos abertos pela sua aplicação, mantendo os processos com mesmo nome que foram abertos independentemente.
Microsoft Community Contributor
-
Rui, acho que não estou me expressando direito.
Na realidade eu tenho o seguinte:
Tenho uma aplicação em VB5 (Pode acreditar), nela tenho uma chamada para a minha aplicação C#. Até tudo certo, pois estou usando o seguinte comando no botão que chama a minha aplicação C#:
Shell "C:\teste.exe " & vParam1 & " " & vParam2 & " " & vParam3
Abre a tela, faço o que preciso nessa tela sem problema algum. Só que o problema vem agora, quando finalizo minha aplicação em VB5 o do C# continua aberto e isso que não pode estar acontecendo.
Me sujeriram eu fazer um outro projeto, só para executar finalizações de processo e fechamento de tela. Então chamaria esse novo projeto no VB5 dessa mesma forma que abro o projeto teste, somente para finalizar.
Se ajudei? Marque como util.. Obrigado :D
-
Eu achei que fosse o contrario, um programa C# chamando um programa em VB por exemplo...
Que foi o que eu fiz no exemplo acima...
A primeira coisa que vou fazer é mover esse tópico para o fórum de VB, talvez lá alguém possa lhe ajudar pois muita gente que acompanha os fóruns de VB não seguem de C# e vice-versa (que é o meu caso por exemplo).
Agora sobre abrir um terceiro programa para fechar os programas abertos... acho muito complicado isso para o usuário.... particularmente eu tentaria converter o aplicativo em VB.NET e ver se roda sem problemas... ai ao invés do Shell você pode usar o Process.Start e controlar os processos como sugeri.
Agora se o aplicativo for muito especifico e não for possível a conversão direta, o certo é controlar internamente no VB, tem como, mas sinceramente já não lembro mais como fazia isso...
Microsoft Community Contributor
-
-
Rui consegui resolver, o código fica assim:
No C# Classe Principal
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Diagnostics;
namespace TF.FinalizaAplicacao
{
public partial class FinalizaAplicacao : Form
{
private Process[] processes;
public FinalizaAplicacao(string vSistema)
{
InitializeComponent();
pFinaliza(vSistema);
Environment.Exit(0);
}
private void pFinaliza(string Sistema)
{
processes = Process.GetProcessesByName(Sistema);
foreach (Process proc in processes)
{
proc.CloseMainWindow();
proc.WaitForExit();
}
}
}
}No C# Classe Program
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace TF.FinalizaAplicacao
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(String[] args)
{
// SISTEMA
string Sistema = args[0];
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new FinalizaAplicacao(Sistema));
}
}
}
CHAMADA NO VB
vSistema = """Formulario.EnviarEmail"""
Shell "C:\TF.FinalizaAplicacao.exe " & vSistema
Se ajudei? Marque como util.. Obrigado :D
- Marcado como Resposta Jaqueline Rodrigues quinta-feira, 6 de fevereiro de 2014 19:35