<< Click to Display Table of Contents >> Não permitir 2 instâncias do projeto |
![]() ![]() ![]() |
using System;
using System.Windows.Forms;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Reflection;
namespace WindowsFormsApplication11
{
static class Program
{
[STAThread]
public static void Main()
{
// pegar a instancia que está rodando
Process instance = RunningInstance();
if (instance == null)
{
// não tem instancia, então roda o programa
Application.Run (new Form());
}
else
{
// existe outra instancia para esse projeto (então foca-a)
HandleRunningInstance(instance);
}
}
// rotina que procura uma instancia para o projeto (processo) atual
public static Process RunningInstance()
{
Process current = Process.GetCurrentProcess();
Process[] processes = Process.GetProcessesByName(current.ProcessName);
// procura até achar um processo com mesmo nome do CurrentProcess
foreach (Process process in processes)
{
// ignora se for "eu mesmo"
if (process.Id != current.Id)
{
// se o nome do EXE for o mesmo, então achamos o mesmo processo!
if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") ==
current.MainModule.FileName)
{
// retorna a instancia deste outro proceso
return process;
}
}
}
// chegou até aqui não achou nada, então é null
return null;
}
public static void HandleRunningInstance(Process instance)
{
// isto restaura a janela de sua condição minimizada ou maximizada
ShowWindowAsync(instance.MainWindowHandle , WS_SHOWNORMAL);
// "puxa" a instância para "cima"
SetForegroundWindow(instance.MainWindowHandle);
}
// declaração de funções das DLLs do Windows
[DllImport("User32.dll")]
private static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
[DllImport("User32.dll")] private static extern bool
SetForegroundWindow(IntPtr hWnd);
private const int WS_SHOWNORMAL = 1;
}
}
Exemplo 2
using System;
using System.Diagnostics;
using System.Windows.Forms;
namespace UnicaInstancia
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
//Verifica se o programa já está em execução
Process[] ListaProcessos = Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName);
foreach (Process P in ListaProcessos)
if (P.Id != Process.GetCurrentProcess().Id)
{
MessageBox.Show("Este programa já está sendo executado.", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
return;
}
//Código gerado automaticamente
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
}