none
Fechar vários Forms de uma unica vez em C# RRS feed

  • 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
    quinta-feira, 6 de fevereiro de 2014 12:37

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

    quinta-feira, 6 de fevereiro de 2014 19:33

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

    quinta-feira, 6 de fevereiro de 2014 12:59
  • 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

    quinta-feira, 6 de fevereiro de 2014 14:56
  • 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

    quinta-feira, 6 de fevereiro de 2014 15:26
  • 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

    quinta-feira, 6 de fevereiro de 2014 15:34
  • 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

    quinta-feira, 6 de fevereiro de 2014 15:36
  • 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

    quinta-feira, 6 de fevereiro de 2014 17:25
  • 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

    quinta-feira, 6 de fevereiro de 2014 17:42
  • Alias, altere o nome do tópico para "Fechar várias aplicações de uma unica vez em VB"

    Microsoft Community Contributor

    quinta-feira, 6 de fevereiro de 2014 17:43
  • 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

    quinta-feira, 6 de fevereiro de 2014 19:33