Como verificar se um formulário do Windows já está aberto e fechá-lo se estiver?

Eu tenho um formulário “fm” que é uma janela de informações simples que abre a cada 10 minutos ( fm.Show(); ).

Como eu posso fazer isso a cada 10 minutos, ele irá verificar se o formulário “fm” está aberto e, se estiver aberto, ele o fecha e abre novamente!

Agora o formulário fm é sempre criado com o form fm = new form();
Por isso, quando tento verificar se o formulário está aberto, será sempre falso e abrir uma nova janela, mesmo que haja um formulário antes!

Preciso ter uma ferramenta para dar uma identidade única e então verificar se este formulário com identidade única está aberto ou não!

Eu não quero apenas atualizar os dados no formulário (fm), porque eu tenho uma informação complicada com botões.

O nome do formulário é "UpdateWindow"

Resolvido usando o seguinte:

 Form fc = Application.OpenForms["UpdateWindow"]; if (fc != null) fc.Close(); fc.Show(); 

talvez isso ajude:

 FormCollection fc = Application.OpenForms; foreach (Form frm in fc) { //iterate through } 

Algum código no foreach para detectar o formulário específico e isso poderia ser feito. Não testado embora.

Encontrado em http://bytes.com/topic/c-sharp/answers/591308-iterating-all-open-forms

Eu sei que estou atrasado … Mas para aqueles que estão curiosos … Esta é outra maneira

 if (Application.OpenForms.OfType().Count() == 1) Application.OpenForms.OfType().First().Close(); UpdateWindow frm = new UpdateWindow() frm.Show(); 

Suponha que, se estivermos chamando um formulário de um menu, clique no formulário MDI, então precisamos criar a declaração de instância desse formulário no nível superior, da seguinte forma:

 Form1 fm = null; 

Em seguida, precisamos definir o evento de clique do menu para chamar o Form1 da seguinte maneira:

 private void form1ToolStripMenuItem_Click(object sender, EventArgs e) { if (fm == null|| fm.Text=="") { fm = new Form1(); fm.MdiParent = this; fm.Dock = DockStyle.Fill; fm.Show(); } else if (CheckOpened(fm.Text)) { fm.WindowState = FormWindowState.Normal; fm.Dock = DockStyle.Fill; fm.Show(); fm.Focus(); } } 

O CheckOpened definido para verificar o Form1 já está aberto ou não:

 private bool CheckOpened(string name) { FormCollection fc = Application.OpenForms; foreach (Form frm in fc) { if (frm.Text == name) { return true; } } return false; } 

Espero que isso resolva os problemas na criação de várias instâncias de um formulário, além de obter foco no Form1 ao clicar no menu, se ele já estiver aberto ou minimizado.

Não tenho certeza se entendi a afirmação. Espero que isto ajude. Se você deseja operar com apenas uma instância deste formulário, você deve impedir que a chamada Form.Dispose seja fechada pelo usuário. Para fazer isso, você pode manipular o evento Closing do formulário filho.

 private void ChildForm_FormClosing(object sender, FormClosingEventArgs e) { this.Hide(); e.Cancel = true; } 

E então você não precisa criar novas instâncias de frm . Apenas chame Show method na instância.

Você pode verificar a propriedade Form.Visible para verificar se o formulário está aberto no momento.

 private ChildForm form = new ChildForm(); private void ReopenChildForm() { if(form.Visible) { form.Hide(); } //Update form information form.Show(); } 

Na verdade, ainda não entendi porque você não atualiza os dados no formulário.

 Form1 fc = Application.OpenForms["Form1 "] != null ? (Form1 ) Application.OpenForms["Form1 "] : null; if (fc != null) { fc.Close(); } 

Ele fechará o form1 e você poderá abri-lo novamente se desejar:

 Form1 frm = New Form1(); frm.show(); 
 if( ((Form1)Application.OpenForms["Form1"]).Visible == true) //form is visible else //form is invisible 

onde Form1 é o nome do seu formulário.

Tente isso, vai funcionar:

 //inside main class Form1 Fm1 = new Form1();
//in button click if (Fm1.IsDisposed) { Fm1 = new Form(); } Fm1.Show(); Fm1.BringToFront(); Fm1.Activate();

tente esta function MDICHILD

 public void mdiChild(Form mdiParent, Form mdiChild) { foreach (Form frm in mdiParent.MdiChildren) { // check if name equals if (frm.Name == mdiChild.Name) { //close if found frm.Close(); return; } } mdiChild.MdiParent = mdiParent; mdiChild.Show(); mdiChild.BringToFront(); } 

Tente ligar abaixo,

 private void frmMyForm_Deactivate(object sender, EventArgs e) { // Raise your flag here. } 

Por fiação acima do evento, ele informará sempre que o formulário for minimizado, parcialmente / totalmente ocultado por outro formulário.

Isto é o que eu usei para fechar todos os formulários abertos (exceto para o formulário principal)

  private void CloseOpenForms() { // Close all open forms - except for the main form. (This is usually OpenForms[0]. // Closing a form decrmements the OpenForms count while (Application.OpenForms.Count > 1) { Application.OpenForms[Application.OpenForms.Count-1].Close(); } } 

Engraçado, eu tive que adicionar a esta discussão.

1) Adicione um var global em form.show () e limpe o var em form.close ()

2) No formulário pai, adicione um timer. Mantenha o formulário filho aberto e atualize seus dados a cada 10 minutos.

3) coloque timer no formulário filho para atualizar os dados em si mesmo.

* Espero que isso funcione para você

 System.Windows.Forms.Form f1 = System.Windows.Forms.Application.OpenForms["Order"]; if(((Order)f1)!=null) { //open Form } else { //not open } 

tente isso

  bool IsOpen = false; foreach (Form f in Application.OpenForms) { if (f.Text == "Form2") { IsOpen = true; f.Focus(); break; } } if (IsOpen == false) { Form2 f2 = new Form2(); f2.MdiParent = this; f2.Show(); } 
  private static Form IsFormAlreadyOpen(Type formType) { return Application.OpenForms.Cast
().FirstOrDefault(openForm => openForm.GetType() == formType); }

Formulário apenas uma vez

Se seu objective é marcar várias instâncias de um formulário, considere seguir …

 public class MyForm : Form { private static MyForm alreadyOpened = null; public MyForm() { // If the form already exists, and has not been closed if (alreadyOpened != null && !alreadyOpened.IsDisposed) { alreadyOpened.Focus(); // Bring the old one to top Shown += (s, e) => this.Close(); // and destroy the new one. return; } // Otherwise store this one as reference alreadyOpened = this; // Initialization InitializeComponent(); } } 
 Form user_rpt = Application.OpenForms["frmUesr_reports"]; if (user_rpt == null) { /// Do Something here } 

Tente isto Esta é a idéia curta para verificar o formulário aberto ou não aberto

No meu aplicativo eu tinha um formulário mainmenu que tinha botões para navegar para uma variedade de outras formas (também conhecidas como sub-formulários). Eu queria que apenas uma instância de cada subformulário estivesse sendo executada por vez. Além disso, eu queria garantir que, caso um usuário tentasse lançar um subformulário já existente, o subformulário seria forçado a exibir “front & center” se minimizado ou atrasado em outras janelas de aplicativo. Usando as respostas atualmente mais votadas, refatorei suas respostas para isso:

 private void btnOpenSubForm_Click(object sender, EventArgs e) { Form fsf = Application.OpenForms["formSubForm"]; if (fsf != null) { fsf.WindowState = FormWindowState.Normal; fsf.Show(); fsf.TopMost = true; } else { Form formSubForm = new FormSubForm(); formSubForm.Show(); formSubForm.TopMost = true; } } 
 if (Application.OpenForms["Form_NAME"] == null) { new Form_NAME().Show(); } 

Se a instância do formulário não estiver aberta, ela entrará no loop IF.

Isso funcionou comigo:

 public void DetectOpenedForm() { FormCollection AllForms = Application.OpenForms; Boolean FormOpen = false; Form OpenedForm = new Form(); foreach (Form form in AllForms) { if (form.Name == "YourFormName") { OpenedForm = form; FormOpen = true; } } if (FormOpen == true) { OpenedForm.Close(); } } 

Eu acho que meu método é o mais simples .

  Form2 form2 = null; private void SwitchFormShowClose_Click(object sender, EventArgs e) { if(form2 == null){ form2 = new Form2(); form2.Show(); } else{ form2.Close(); form2 = null; } } 

O abaixo realmente funciona muito bem.

 private void networkInformationToolStripMenuItem_Click(object sender, EventArgs e) { var _open = false; FormCollection fc = Application.OpenForms; foreach (Form frm in fc) { if (frm.Name == "FormBrowseNetworkInformation") { _open = true; frm.Select(); break; } } if (_open == false) { var formBrowseNetworkInformation = new FormBrowseNetworkInformation(); formBrowseNetworkInformation.Show(); } } 

Além disso, pode ser que isso ajude

class Helper { public void disableMultiWindow(Form MdiParent, string formName) { FormCollection fc = Application.OpenForms; try { foreach (Form form in Application.OpenForms) { if (form.Name == formName) { form.BringToFront(); return; } } Assembly thisAssembly = Assembly.GetExecutingAssembly(); Type typeToCreate = thisAssembly.GetTypes().Where(t => t.Name == formName).First(); Form myProgram = (Form)Activator.CreateInstance(typeToCreate); myProgram.MdiParent = MdiParent; myProgram.Show(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } }
class Helper { public void disableMultiWindow(Form MdiParent, string formName) { FormCollection fc = Application.OpenForms; try { foreach (Form form in Application.OpenForms) { if (form.Name == formName) { form.BringToFront(); return; } } Assembly thisAssembly = Assembly.GetExecutingAssembly(); Type typeToCreate = thisAssembly.GetTypes().Where(t => t.Name == formName).First(); Form myProgram = (Form)Activator.CreateInstance(typeToCreate); myProgram.MdiParent = MdiParent; myProgram.Show(); } catch (Exception ex) { MessageBox.Show(ex.Message); } } }