Verifica se la mia applicazione Windows è in esecuzione

Come posso controllare se la mia applicazione C # per Windows è in esecuzione?

So che posso controllare il nome del processo ma il nome può essere cambiato se cambia l’exe.

C’è un modo per avere una chiave hash o qualcosa per rendere unica la mia applicazione?

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); } } 

Il modo consigliato è usare un Mutex. È ansible controllare un esempio qui: http://www.codeproject.com/KB/cs/singleinstance.aspx

Nello specifico il codice:

 /// /// 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; } 

Per la mia applicazione WPF ho definito l’ID app globale e uso il semaforo per gestirlo.

 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(); } } 

Credo che sarebbe davvero semplicistico, per ogni exe in esecuzione, potresti creare / aprire un file su disco in una posizione nota (c: \ temp) con un nome speciale “yourapp.lock” e poi contare quanti di quelli che ci sono

Un modo più difficile sarebbe aprire una comunicazione inter-processo, o socket, quindi con l’elenco dei processi è ansible interrogare ogni processo per vedere se era la vostra applicazione.

Cassa: qual è un buon modello per l’utilizzo di un Mutex globale in 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(); } } } 

hai bisogno di un modo per dire che “sto correndo” dall’app,

1) apri un servizio ping WCF 2) scrivi su registro / file all’avvio ed elimina su shutdown 3) crea un Mutex

… Preferisco la parte WCF perché non si può pulire correttamente il file / registro e il Mutex sembra avere i suoi problemi

Immettere un guid nei dati dell’assieme. Aggiungi questo guid al registro. Immettere una chiave di registro in cui l’applicazione legge il proprio nome e aggiunge il nome come valore lì.

L’altro osservatore di attività legge la chiave reg e conosce il nome dell’app.

puoi semplicemente usare varialbles e un file per verificare l’esecuzione del programma. quando si apre il file contiene un valore e quando il programma si chiude cambia questo valore in un altro.