2009-08-05 16 views
6

Come posso ottenere il numero di volte in cui un programma è stato eseguito in precedenza in C# senza tenere un file e il conteggio. Se non è possibile in questo modo, può essere ottenuto dal Task Manager pianificato?Quante volte è stato eseguito il programma? C#

A C. Ross: come si farebbe in un'impostazione di registro? perdonami. . . che cos'è un'impostazione di registro?

+0

@ "che cosa è un'impostazione del Registro di sistema?"- il registro è un file organizzato di informazioni contenente i dati del programma e della configurazione per una determinata installazione di Windows Chesso fornisce un esempio decente di come interagire con esso di seguito: non giocare nel registro a meno che non sia comodo, può essere simile a fare un intervento chirurgico al cervello su qualcuno che è sveglio (vale a dire molto male) – Hardryv

+0

@Donta. Cheeso ha una risposta eccellente.Vorrei raccomandare l'utilizzo del loro. –

risposta

10

In base alle mie conoscenze, Windows non conserva queste informazioni per voi. Dovresti calcolare il valore da qualche parte (file, database, impostazioni del registro). L'Utilità di pianificazione di Windows è funzionalità molto bassa.

+2

+1, per un'idea di voce del Registro di sistema – nik

+0

In realtà lo fa. http://stackoverflow.com/a/6134506/3620828 – Wally

+0

@wally Non sembra che sia una cosa sicura da integrare a. –

0

No, il task manager non fornisce questo tipo di informazioni. Non sarebbe difficile creare uno script che aggiorni un riscontro e quindi esegua l'applicazione e quindi imposta l'attività per chiamare lo script.

13

Lo faccio in un'impostazione di registro.

static string AppRegyPath = "Software\\Cheeso\\ApplicationName"; 
static string rvn_Runs = "Runs"; 

private Microsoft.Win32.RegistryKey _appCuKey; 
public Microsoft.Win32.RegistryKey AppCuKey 
{ 
    get 
    { 
     if (_appCuKey == null) 
     { 
      _appCuKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(AppRegyPath, true); 
      if (_appCuKey == null) 
       _appCuKey = Microsoft.Win32.Registry.CurrentUser.CreateSubKey(AppRegyPath); 
     } 
     return _appCuKey; 
    } 
    set { _appCuKey = null; } 
} 

public int UpdateRunCount() 
{ 
    int x = (Int32)AppCuKey.GetValue(rvn_Runs, 0); 
    x++; 
    AppCuKey.SetValue(rvn_Runs, x); 
    return x; 
} 

Se si tratta di un'applicazione WinForms, è possibile agganciare evento OnClosing del form per l'esecuzione UpdateCount.

+8

Stai fuori dal mio registro! – jason

+11

Non eseguire il mio codice! – Cheeso

+2

+1 causa del codice dato, molto bello –

0

mi consiglia di utilizzare il database ESENT che è incluso in Windows. Il supporto software è facilmente disponibile con ESENT Managed Interface.

0

@Cheeso,

Non c'è bisogno la variabile membro privata con quel codice, un modo per dimagrire giù un po ':

using Microsoft.Win32; 
public RegistryKey AppCuKey 
{ 
    get 
    { 
     return Registry.CurrentUser.OpenSubKey(AppRegyPath, true) 
      ?? Registry.CurrentUser.CreateSubKey(AppRegyPath); 
    } 
} 

O, se si desidera aggiornare il variabile privata, al fine di evitare di chiamare il metodo (che è comunque un metodo abbastanza economico), è comunque possibile salvare se stessi un se == null controllo.

+0

Avere un ritorno di proprietà qualcosa che il chiamante dovrebbe disporre è un design incredibilmente pessimo. -1 – erikkallen

+0

Uso la proprietà perché faccio riferimento ad altre impostazioni del registro in altri luoghi. @ Erikkallen, non vedo come sia un cattivo progetto restituire un IDisposable da un getter. Potrebbe essere un cattivo progetto non disporlo(). – Cheeso

1

Si potrebbe semplicemente creare un application setting chiamato Properties.Settings.Default.TimesRun;

Utilizzare in questo modo:

private void Form1_Load(object sender, EventArgs e) 
{ 
    Properties.Settings.Default.TimesRun = timesrun++; 
    Properties.Settings.Default.Save(); 
} 
6

il numero di volte un app ha eseguito viene memorizzato nel Registro di sistema; ci sono un paio di avvertimenti, però:

  1. E 'memorizzata nella utente registro (HKCU per esempio) [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist]
  2. Il percorso viene memorizzato in ROT13 così per esempio RunMe.exe diventerebbe ehazr.rkr
  3. Il registro memorizza in realtà tre valori in formato binario: l'ultimo runtime, il conteggio delle esecuzioni (che inizia per 6 anziché 1, per qualche motivo) e il nome dell'applicazione.

Non so se questo aiuta, ma ce l'hai!

+1

Non riuscivo davvero a crederci, ma dopo aver fatto una piccola ricerca di devenv.exe in ROT13 (che è qrirai.rkr) ho trovato davvero alcune voci interessanti sotto '[HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ UserAssist ] '. – Oliver

+0

Wow, è piuttosto bizzarro. Cosa realizzi archiviandolo in questo modo? – chaz

+1

Se stai cercando progetti Open Source che implementino questo aspetto su https://github.com/JockiHendry/ProgramExecutionCounter. È scritto in C# – Wally

0
int x = Your_Project.Properties.Settings.Default.Counter; 
x++; 
Your_Project.Properties.Settings.Default.Counter = x; 
Your_Project.Properties.Settings.Default.Save(); 
+0

Sebbene questo snippet di codice possa risolvere la domanda, [includendo una spiegazione] (// meta.stackexchange.com/questions/114762/explaining-entally-code-based-answers) aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro, e queste persone potrebbero non conoscere le ragioni del tuo suggerimento sul codice. Cerca anche di non affollare il tuo codice con commenti esplicativi, in quanto ciò riduce la leggibilità sia del codice che delle spiegazioni! – FrankerZ

Problemi correlati