2009-08-05 33 views
6

¿Cómo puedo obtener la cantidad de veces que un programa se ejecutó previamente en C# sin guardar un archivo y sin contar? Si no es posible de esa manera, ¿puede obtenerse del Administrador de tareas programadas?¿Cuántas veces se ejecutó el programa? C#

Para C. Ross: ¿cómo se haría esto en una configuración de registro? Perdóname. . . ¿Qué es una configuración de registro?

+0

@ "¿Qué es una configuración de registro?"- el registro es un archivo organizado de información que contiene datos de programa y configuración para una instalación determinada de Windows. Chesso proporciona un ejemplo decente de cómo interactuar con él a continuación. No juegue en el registro a menos que sea cómodo, puede ser similar a hacer una cirugía cerebral en alguien que está despierto (es decir, muy malo). – Hardryv

+0

@Donta. Cheeso tiene una respuesta excelente. Yo recomendaría usar la de ellos. –

Respuesta

10

A mi mejor saber y entender, Windows no conserva esta información para usted. Tendría que contar el valor en algún lugar (archivo, base de datos, configuración de registro). El Programador de tareas de Windows tiene una funcionalidad muy baja.

+2

+1, para una idea de registro de entrada – nik

+0

En realidad lo hace. . http://stackoverflow.com/a/6134506/3620828 – Wally

+0

@wally No parece que sea seguro integrarse. –

0

No, el administrador de tareas no proporciona ese tipo de información. No sería difícil crear una secuencia de comandos que actualice una cuenta y luego ejecute la aplicación y luego configure la tarea para llamar al script.

13

Lo hago en una configuración de 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; 
} 

Si se trata de una aplicación de Windows Forms, se puede conectar caso OnClosing del formulario para ejecutar UpdateCount.

+8

¡Quédate fuera de mi registro! – jason

+11

¡No ejecute mi código! – Cheeso

+2

+1 causa del código dado, muy bueno –

0

recomiendo el uso de la base de datos ESENT que se incluye con Windows. El soporte de software está fácilmente disponible con ESENT Managed Interface.

0

@Cheeso,

Usted no necesita la variable miembro privada con ese código, una forma de delgado hacia abajo un poco:

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

O, si se quiere actualizar el variable privada, para evitar llamar al método (que es un método bastante barato, de todos modos), aún puede ahorrarse un si == nulo cheque.

+0

Tener una propiedad devolver algo que la persona que llama debería disponer es un diseño increíblemente malo. -1 – erikkallen

+0

Uso la propiedad porque me refiero a otras configuraciones de registro en otros lugares. @erikkallen, no veo cómo es un mal diseño devolver un IDisposable de un getter. Puede ser un mal diseño no Deshacerlo(). – Cheeso

1

Simplemente podría crear una application setting llamados Properties.Settings.Default.TimesRun;

usarlo como así:

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

El número de veces que una aplicación se ejecute se almacena en el registro; hay un par de advertencias, sin embargo:

  1. Se almacena en el usuario registro (HKCU por ejemplo) [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist]
  2. La ruta se almacena en ROT13 Así, por ejemplo runme.exe se convertiría en ehazr.rkr
  3. El registro en realidad almacena tres valores en forma binaria: el último tiempo de ejecución, el recuento de ejecución (que comienza en 6 en lugar de 1, por alguna razón) y el nombre de la aplicación.

No sé si esto ayuda, ¡pero ya lo tiene!

+1

Realmente no lo podía creer, pero después de hacer una pequeña búsqueda de devenv.exe en ROT13 (que es qrirai.rkr) encontré algunas entradas interesantes bajo '[HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ UserAssist ] '. – Oliver

+0

Guau, eso es bastante extraño. ¿Qué logras al almacenarlo de esa manera? – chaz

+1

Si está buscando proyectos de código abierto que implementen esta vista, visite https://github.com/JockiHendry/ProgramExecutionCounter. Está escrito en 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

Si bien este fragmento de código puede resolver la pregunta, [incluyendo una explicación] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) realmente ayuda a mejorar la calidad de su publicación. Recuerde que usted está respondiendo la pregunta a los lectores en el futuro, y es posible que esas personas no sepan los motivos de su sugerencia de código. Por favor, intente no saturar su código con comentarios explicativos, ya que esto reduce la legibilidad tanto del código como de las explicaciones. – FrankerZ

Cuestiones relacionadas