Ir al contenido


Foto

Saber cuando aplicación inicia por primera vez en cada encendido


  • Por favor identifícate para responder
10 respuestas en este tema

#1 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 30 marzo 2015 - 02:41

Muy buenas con todos hermanos 27.gif , disculpen la molestía si pueden ayudarme en este dilema.

 

Como puedo saber cuando mi aplicación es iniciada por primera vez en cada encendido de la PC. es decir cuando prenda la PC e inicie mi programa saber que es la primera vez que se ejecuta sin importar las demás ejecuciones, pero siempre hacer esa comprobación en cada encendido.

 

Gracias por su tiempo. :) :)


  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 30 marzo 2015 - 03:34

Una posible solución sería hacer otra pequeña aplicación que se ejecute como un servicio y que arranque con el OS, dicha aplicación llevaría un registro en un archivo .ini  de cada inicio del OS, y  la aplicación que quieres monitorear solo debería escribir en el .ini la fecha y hora de cada ejecución, dicho archivo podría limpiarse en cada arranque del OS.

 

Saludos.

 

PD: Es muy posible que los maestros de la API tengan una solución más simple.


  • 1

#3 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 30 marzo 2015 - 04:36

¿Que necesitas exactamente? Saber si tu aplicacion ya se esta ejecutando o saber si se ha ejecutado en algun momento desde el ultimo reinicio


  • 0

#4 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 30 marzo 2015 - 04:47

Bueno lo que me gustaría hacer es lo siguiente:

 

* enciendo PC  

* ejecuto mi programa   ----> primera ejecución ¿Cómo saberlo?

* ejecuto mi programa otras veces....

* apago mi PC

 

en otro momento....

 

* enciendo PC  

* ejecuto mi programa   ----> primera ejecución ¿Cómo saberlo?

* ejecuto mi programa otras veces....

* apago mi PC

 

 

Espero me entiendan amigos y espero su ayuda.


  • 0

#5 Héctor Randolph

Héctor Randolph

    501st Legion

  • Moderadores
  • PipPipPip
  • 664 mensajes
  • LocationMéxico

Escrito 30 marzo 2015 - 05:30

Si es exclusivamente para Windows tenemos la función GetTickCount

 

https://msdn.microso...8(v=vs.85).aspx

 

Con ella puedes obtener el total de milisegundos transcurridos desde el último inicio del sistema.

 

Adicionalmente puedes guardar en el registro la última vez que inició tu aplicación, entonces ya tendrás algo para comparar.

 

Si es para Linux,  tal vez se pueda encontrar un equivalente para saber la fecha y hora del inicio de sistema

 

 

Saludos


  • 2

#6 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 30 marzo 2015 - 05:38

Pues no queda mas remedio que dejar algun tipo de "marca" para saber que el programa ya se ha ejecutado, y lo mas sencillo es un fichero.
 
Solamente tenemos que asegurarnos de que el fichero se borra cada vez que el sistema se inicia y podemos dejar que el sistema operativo se encargue de eso.

delphi
  1. function SoyElPrimero: Boolean;
  2. var
  3. Filename: String;
  4. begin
  5. // Usamos para guardar el fichero la misma ruta que el ejecutable
  6. Filename:= ChangeFileExt(ExpandFileName(ParamStr(0)),'.flg');
  7. // Si el fichero no esta somos los primeros
  8. if not FileExists(Filename) then
  9. begin
  10. // Creamos el fichero
  11. CloseHandle(FileCreate(Filename));
  12. // Y le decimos al sistema que lo borre en el proximo inicio
  13. MoveFileEx(PAnsiChar(Filename),nil,MOVEFILE_DELAY_UNTIL_REBOOT);
  14. Result:= TRUE;
  15. end else
  16. Result:= FALSE;
  17. end;

Lo malo es que esto solo funciona si estamos ejecutando nuestra aplicacion como administrador :sad:
 
Opción 2:
 
Añade la siguiente unit a tu proyecto:


delphi
  1. unit uSoyElPrimero;
  2.  
  3. interface
  4.  
  5. uses Windows, Sysutils, Registry;
  6.  
  7. function SoyElPrimero: Boolean;
  8.  
  9. implementation
  10.  
  11. const
  12. Name = '1E951A18-7D9E-455E-AF20-E62EAC97D794';
  13. Flag = '5CD98646-3448-4DAB-BCAA-396D07681EB4';
  14.  
  15. function SoyElPrimero: Boolean;
  16. begin
  17. Result:= TRUE;
  18. with TRegistry.Create do
  19. try
  20. RootKey:= HKEY_CURRENT_USER;
  21. if OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',TRUE) then
  22. begin
  23. if ValueExists(Name) then
  24. Result:= FALSE
  25. else
  26. WriteString(Name,ExpandFileName(ParamStr(0)) + ' /' + Flag);
  27. end;
  28. finally
  29. Free;
  30. end;
  31. end;
  32.  
  33. initialization
  34. if FindCmdLineSwitch(Flag) then
  35. try
  36. with TRegistry.Create do
  37. try
  38. RootKey:= HKEY_CURRENT_USER;
  39. if OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',TRUE) then
  40. begin
  41. if ValueExists(Name) then
  42. DeleteValue(Name);
  43. end;
  44. finally
  45. Free;
  46. end;
  47. finally
  48. Halt;
  49. end;
  50. finalization
  51.  
  52. end.

Y ella se encargara de todo:


delphi
  1. begin
  2. if SoyElPrimero then
  3. Writeln('Soy el primero')
  4. else
  5. Writeln('Llegue tarde ...');
  6. Readln;
  7. end.

Aqui son las 1:38 AM asi que si no entiendes algo mañana te lo explico |-)
  • 3

#7 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 31 marzo 2015 - 09:37

Gracias por sus respuestas las voy a probar.  :)


  • 0

#8 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 31 marzo 2015 - 06:22

Buenas con todos amigos de momento voy a tratar de probar la primera idea que me sugerieron, crear dos aplicaciones, una se llamará "start proyecto1.exe" (será el que tendrá el poder de mandar la señal de primera ejecución :) ) y el otro se llamará "proyecto1.exe" y pienso hacerlos trabajar de la siguiente manera:

 

* enciendo PC  

* se ejecuta "start proyecto1.exe"  y manda una señal de primera ejecución

* el programa "start proyecto1.exe" abre el otro programa "proyecto1.exe" y seguidamente se autocierra el programa "star proyecto1.exe"

* el programa "proyecto1.exe" queda activo

* ejecuto "proyecto1.exe" otras veces

* apago mi PC

 

en otro momento....  *-) *-)

 

* enciendo PC  

* se ejecuta "start proyecto1.exe"  y manda una señal de primera ejecución

* el programa "start proyecto1.exe" abre el otro programa "proyecto1.exe" y seguidamente se autocierra el programa "start  proyecto1.exe"

* el programa "proyecto1.exe" queda activo

* ejecuto "proyecto1.exe" otras veces

* apago mi PC

 

 

Lo voy a probarlo y les comento :) :)


  • 1

#9 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 01 abril 2015 - 07:36

Me parece que la idea de Seoane es un poco más robusta (y viendo que este tema está en Lazarus, cabe preguntarse si la idea es hacer un software multiplataforma o atarse a Windows). Detecta efectivamente si se apaga la PC o se reinicia.

Pero veamos el asunto desde más profundo... Hazte esta pregunta ¿Y que pasa, o debiera pasar, si dicha PC no se apaga y deja encendida más de 24hs?

 

¿Cuál es el objetivo de detectar cada vez que inicia por 1ra vez? ¿Que de especial o importante debe hacerse en ese momento y no en las sucesivas veces?

 

Saludos,


  • 1

#10 monchito_elroro

monchito_elroro

    Advanced Member

  • Miembros
  • PipPipPip
  • 259 mensajes

Escrito 01 abril 2015 - 09:04

Muchas gracias por sus comentario amigos :) , bueno lo que deseo desarrollar es lo siguiente:

 

Deseo crear una aplicación tal.

la cual cuando la abra primero generará un "Splahscreen" ó un pantallazo de bienvenida, luego abrirá el "form" principal

Mi idea era solo detectar el primer inicio del momento para así lanzar sólo el "Splahscreen" sólo una vez y no cada vez que arranque mi aplicación, pues pienso que sería muy molesto a la larga.

El "Splahscreen" y el "form" principal están en un solo EXE, y no encuentro manera de como hacer que mandará la señal de primera ejecucíon  :(  :( .

Pense primero en trabajar con el registro.

 

haciendo lo siguiente:

 

if not "claveexiste" then

        begin

        {primer inicio}

        end

else

        begin

        {ya se ejecutó}

        end;

 

 

pero lo malo es que tendría que borrarse junto con el apagado, sino quedaría grabado el "primer inicio" y siempre me detectaría que ya se ejecuto. :sad:


  • 0

#11 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 01 abril 2015 - 10:48

Yo usaria algun archivo temporario, tu aplicacion inicia
 
a. Si el archivo existe, entonces significa que no es la primer ejecucion (ya se ejecuto antes)
b. Si no existe, lo creas y luego lo marcas como borrado en el proximo inicio de windows con una funcion como esta
 


delphi
  1. // Use MoveFileEx with the MOVEFILE_DELAY_UNTIL_REBOOT flag instead:
  2. if not MoveFileEx(PChar(YourFileToDelete), nil, MOVEFILE_DELAY_UNTIL_REBOOT) then
  3. SysErrorMessage(GetLastError);

 
Extraido de:

http://stackoverflow...from-my-program


  • 1




IP.Board spam blocked by CleanTalk.