Verificando se meu aplicativo do Windows está em execução

Como faço para verificar se meu aplicativo do Windows c # está sendo executado?

Eu sei que posso verificar o nome do processo, mas o nome pode ser alterado se o exe mudar.

Existe alguma maneira de ter uma chave de hash ou algo para tornar meu aplicativo exclusivo?

public partial class App : System.Windows.Application { public bool IsProcessOpen(string name) { foreach (Process clsProcess in Process.GetProcesses()) { if (clsProcess.ProcessName.Contains(name)) { return true; } } return false; } protected override void OnStartup(StartupEventArgs e) { // Get Reference to the current Process Process thisProc = Process.GetCurrentProcess(); if (IsProcessOpen("name of application.exe") == false) { //System.Windows.MessageBox.Show("Application not open!"); //System.Windows.Application.Current.Shutdown(); } else { // Check how many total processes have the same name as the current one if (Process.GetProcessesByName(thisProc.ProcessName).Length > 1) { // If ther is more than one, than it is already running. System.Windows.MessageBox.Show("Application is already running."); System.Windows.Application.Current.Shutdown(); return; } base.OnStartup(e); } } 

A maneira recomendada é usar um mutex. Você pode conferir um exemplo aqui: http://www.codeproject.com/KB/cs/singleinstance.aspx

Em específico o código:

 /// /// check if given exe alread running or not /// /// returns true if already running private static bool IsAlreadyRunning() { string strLoc = Assembly.GetExecutingAssembly().Location; FileSystemInfo fileInfo = new FileInfo(strLoc); string sExeName = fileInfo.Name; bool bCreatedNew; Mutex mutex = new Mutex(true, "Global\\"+sExeName, out bCreatedNew); if (bCreatedNew) mutex.ReleaseMutex(); return !bCreatedNew; } 

Para o meu aplicativo WPF, eu defini o id global do aplicativo e uso o semáforo para lidar com ele.

 public partial class App : Application { private const string AppId = "c1d3cdb1-51ad-4c3a-bdb2-686f7dd10155"; //Passing name associates this sempahore system wide with this name private readonly Semaphore instancesAllowed = new Semaphore(1, 1, AppId); private bool WasRunning { set; get; } private void OnExit(object sender, ExitEventArgs e) { //Decrement the count if app was running if (this.WasRunning) { this.instancesAllowed.Release(); } } private void OnStartup(object sender, StartupEventArgs e) { //See if application is already running on the system if (this.instancesAllowed.WaitOne(1000)) { new MainWindow().Show(); this.WasRunning = true; return; } //Display MessageBox.Show("An instance is already running"); //Exit out otherwise this.Shutdown(); } } 

Eu realmente simplista maneira eu acho que seria, para cada exe que está sendo executado, você poderia criar / abrir um arquivo no disco em um local conhecido (c: \ temp) com um nome especial “yourapp.lock” e, em seguida, basta contar quantas daqueles que existem.

Uma maneira mais difícil seria abrir algumas comunicações entre processos, ou sockets, então, com a lista de processos, você poderia interrogar cada processo para ver se era sua aplicação.

Checkout: O que é um bom padrão para usar um Mutex Global em C # ?

 // unique id for global mutex - Global prefix means it is global to the machine const string mutex_id = "Global\\{B1E7934A-F688-417f-8FCB-65C3985E9E27}"; static void Main(string[] args) { using (var mutex = new Mutex(false, mutex_id)) { // edited by Jeremy Wiebe to add example of setting up security for multi-user usage // edited by 'Marc' to work also on localized systems (don't use just "Everyone") var allowEveryoneRule = new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.FullControl, AccessControlType.Allow); var securitySettings = new MutexSecurity(); securitySettings.AddAccessRule(allowEveryoneRule); mutex.SetAccessControl(securitySettings); //edited by acidzombie24 var hasHandle = false; try { try { // note, you may want to time out here instead of waiting forever //edited by acidzombie24 //mutex.WaitOne(Timeout.Infinite, false); hasHandle = mutex.WaitOne(5000, false); if (hasHandle == false) return;//another instance exist } catch (AbandonedMutexException) { // Log the fact the mutex was abandoned in another process, it will still get aquired } // Perform your work here. } finally { //edit by acidzombie24, added if statemnet if (hasHandle) mutex.ReleaseMutex(); } } } 

você precisa de uma maneira de dizer que “eu estou correndo” do aplicativo,

1) abrir um serviço de ping WCF 2) gravar no registro / arquivo na boot e excluir no desligamento 3) criar um Mutex

… eu prefiro a parte do WCF porque você não pode limpar o arquivo / registro corretamente e o Mutex parece ter seus próprios problemas

Digite um guia nos dados da sua assembly. Adicione este guid ao registro. Digite uma chave reg onde o aplicativo leia seu próprio nome e adicione o nome como valor lá.

O outro observador de tarefas lê a chave reg e conhece o nome do aplicativo.

Você pode simplesmente usar varialbles e um arquivo para verificar a execução do seu programa. quando aberto o arquivo contém um valor e quando o programa fecha muda este valor para outro.