Hola,
A ver. Tienes que centrarte en una sola cosa: cuando escribas la clave en el Registro de Windows para que tu aplicación se inicie junto al sistema operativo, a la ruta de tu programa, añádele un parámetro "-runstart", por ejemplo, o con cualquier otro nombre.
¿Porque lo que es claro es que desde tu aplicación se añade la clave de marras en el Registro de Windows? ¿Verdad? O lo haces desde el programa de instalación, o como sea, pero, tienes que hacerlo: es una clave que no viene en el sistema, que es de tú sistema y eres tú quien la añade al Registro de Windows.
Pues bien, como se ha dicho, al hacerlo, al añadir la clave en el Registro de Windows, añade a la ruta de tu programa (que tienes que indicar para que Windows sepa dónde está el programa que ha de ejecutar al inicio del sistema) el parámetro de marras: sea "-runstart" o cualquier otro: el nombre lo eliges tú.
Una vez tengas eso... lo único que tienes que hacer es fijarte en el inicio de tu aplicación si existe dicho parámetro, y, si es que existe, ya sabrás que el programa se inició "por Windows" al iniciar el sistema, y no por ningún usuario que hiciera "doble clic" en el ejecutable, puesto que al hacer esto último no se le pasaría parámetro alguno a tu programa.
Resumiendo:
1º Céntrate en la clave en el Registro de Windows que escribes para que tu programa se ejecute al inicio del sistema: añade a la ruta del programa a ejecutar un parámetro, tal y como arriba te muestra Federico:
Código Delphi
[-]
WriteString(ExtractFileName(ParamStr(0)), ParamStr(0) + ' -runstart');
2º Cuando tu programa se inicie (por ejemplo, puedes aprovechar el evento "OnCreate" del formulario principal de la aplicación) mira a ver si encuentras el parámetro "-runstart" (en este caso, ya digo que el nombre lo pones tú y puedes poner el que quieras y estimes oportuno).
3º Lo demás es sencillo:
Código Delphi
[-]
if FindCmdLineSwitch('runstart') then
ShowMessage('Tu programa lo inició Windows siguiendo el registro')
else
ShowMessage('Tu programa no lo inició Windows sino algún usuario');
Sin embargo, ten en cuenta una cosa. Si lo que tratas de dilucidar a partir de todo esto es algo importante para tu programa, has de saber que sería muy sencillo para cualquier crear un acceso directo a tu programa, de tal manera que incluya en el mismo el parámetro "-runstart"...
Si un usuario hace conseguirá engañar a tu sistema, es decir, el sistema pensará (y obrará) como si lo hubiera iniciado Windows, pero, no lo habrá iniciado Windows sino un usuario "algo avispado"...
No sé. Tal vez podría dársele alguna que otra vuelta a esto. Cualquier comentario que tengas no te lo guardes a ver si entre todos podemos llegar a algún lugar.
