2009-08-05 31 views
6

Wie kann ich herausfinden, wie oft ein Programm zuvor in C# ausgeführt wurde, ohne eine Datei und Tally zu speichern? Wenn es so nicht möglich ist, kann es vom Scheduled Task Manager abgerufen werden?Wie oft wurde das Programm ausgeführt? C#

Zu C. Ross: Wie würde dies in einer Registrierungseinstellung getan werden? vergib mir. . . Was ist eine Registrierungseinstellung?

+0

@ "Was ist eine Registrierungseinstellung?"- Die Registrierung ist eine organisierte Datei von Informationen mit Programm-und Konfigurationsdaten für eine bestimmte Installation von Windows. Chesso bietet ein anständiges Beispiel für die Interaktion mit ihm. Spielen Sie nicht in der Registrierung herum, es sei denn, Sie sind komfortabel kann mit der Gehirnchirurgie auf jemandem verglichen werden, der wach ist (dh sehr schlecht). – Hardryv

+0

@Donta. Cheeso hat eine ausgezeichnete Antwort. Ich würde ihre verwenden. –

Antwort

10

Nach meinem besten Wissen speichert Windows diese Informationen nicht für Sie. Sie müssten den Wert irgendwo abgleichen (Datei, Datenbank, Registrierungseinstellung). Der Windows Taskplaner hat eine sehr geringe Funktionalität.

+2

+1, für eine Idee des Registereintritts. – nik

+0

Wirklich tut es. Benutzer-Hilfsmittel http://stackoverflow.com/a/6134506/3620828 – Wally

+0

@wally Das klingt nicht wie es ist sicher, dass zu integrieren. –

0

Nein, Task-Manager bietet diese Art von Informationen nicht. Ich würde nicht schwer sein, ein Skript zu erstellen, das eine Tally aktualisieren und dann die Anwendung ausführen und dann die Aufgabe einrichten würde, um das Skript aufzurufen.

13

Ich mache dies in einer Registrierungseinstellung.

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

Wenn es eine WinForms-Anwendung ist, können Sie die OnClosing-Ereignis des Formulars Haken UpdateCount zu laufen. Hier

+8

Bleib aus meiner Registrierung! – jason

+11

Führe meinen Code nicht aus! – Cheeso

+2

+1 Ursache des angegebenen Codes, sehr schön –

0

ich empfehlen die Verwendung der ESENT-Datenbank, die mit Windows enthalten ist. Software-Unterstützung ist leicht verfügbar mit ESENT Managed Interface.

0

@Cheeso,

Sie nicht brauchen die private Variable mit diesem Code, ein Weg, um schlank es ein wenig nach unten:

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

Oder, wenn Sie die aktualisierenden Private Variable, um von der Methode (die eine ziemlich billige Methode ist, auf jeden Fall zu nennen) zu halten, können Sie sich immer noch eine If == null überprüfen.

+0

Eine Eigenschaft zurückgeben, die der Anrufer entsorgen sollte, ist ein unglaublich schlechtes Design. -1 – erikkallen

+0

Ich verwende die Eigenschaft, weil ich auf andere Registrierungseinstellungen an anderen Orten verweisen. @erikkallen, ich sehe nicht, wie es ein schlechter Entwurf ist, ein IDisposable von einem Getter zurückzugeben. Es könnte ein schlechtes Design sein, es nicht zu entsorgen(). – Cheeso

1

können Sie einfach erstellen ein application settingProperties.Settings.Default.TimesRun; genannt

Verwenden Sie es wie folgt:

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

Die Anzahl der Zeit hat eine App ausgeführt wird in der Registry gespeichert; obwohl es ein paar Einschränkungen,:

  1. Es gespeichert ist in den Benutzern Register (HKCU zum Beispiel) [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist]
  2. Der Weg in ROT13 gespeichert ist, so zum Beispiel RunMe.exe ehazr.rkr
  3. werden würde
  4. Die Registrierung speichert tatsächlich drei Werte in binärer Form: die letzte Laufzeit, die Laufzahl (die aus irgendeinem Grund bei 6 statt 1 beginnt) und den Namen der Anwendung.

Weiß nicht, ob das hilft, aber da hast du es!

+1

Ich konnte es wirklich nicht glauben, aber nach einer kleinen Suche nach devenv.exe in ROT13 (welches qrirai.rkr ist) habe ich wirklich einige interessante Einträge unter '[HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ UserAssist gefunden ] '. – Oliver

+0

Wow, das ist ziemlich bizarr. Was bewerkstelligen Sie, indem Sie es so lagern? – chaz

+1

Wenn Sie nach Open Source-Projekten suchen, wenden Sie sich an https://github.com/JockiHendry/ProgramExecutionCounter. Es ist in geschrieben 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

Während dieses Code-Snippet die Frage lösen kann, [hilft eine Erklärung] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) wirklich, um die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in der Zukunft beantworten, und diese Leute könnten die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch nicht, Ihren Code mit erläuternden Kommentaren zu überladen, da dies die Lesbarkeit sowohl des Codes als auch der Erklärungen verringert! – FrankerZ

Verwandte Themen