Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Iniciar aplicacion con Windows para todos los usuarios

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Iniciar aplicacion con Windows para todos los usuarios Responder citando

hola a todos:

hasta ahora he utilizado este código (copiado de este foro) para iniciar aplicaciones:
Código:
TRegistry *R = new TRegistry;
  R->RootKey = HKEY_LOCAL_MACHINE;
  if (R->OpenKey("Software\\Microsoft\\Windows\\CurrentVersion\\Run", true))
    R->WriteString(ExtractFileName(Application->ExeName), Application->ExeName+" a");
  delete R;


Lo que sucede es que solo inicia la apliación en el usuario donde se ejecutó. Cuando cambio de usuario no se ejecuta en dicho usuario.

¿Cómo puedo hacer para que se ejecute en todos los usuarios?

Gracias.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Pues tal como esta debería funcionar en Windows XP y anteriores si el usuario tiene privilegios de administrador..

Prueba esta versión:

https://cppbuilder.es/viewtopic.php?p=40355
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias por responder _Leo:

amplio un poco más el asunto:
Tengo dos usuarios, user1 y user2. Mi aplicación se ejecuta al iniciar el sistema ya sea con el 1 o el 2. Una vez que el sistema se ha iniciado (por ejemplo con user1), se puede cambiar de usuario (sin reiniciar) lo que hace que mi aplicación siga ejecutándose en el user1, pero en el user2 también se está ejecutando, ya que se puede acceder al programa.
La idea es poder hacer que mi aplicación sepa cuando está con cada usuario, de esta manera pueda decidir que hacer con cada usuario.
Asi puedo ejecutar la aplicación solo para un usuario, ya que no me interesa tener la aplicacion corriendo en dos usuarios a la vez.

Como puedo saber si se ha cambiado de usuario?
Muchas gracias de antemano.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

La solución la puedes tener en los archivos *.INI privados a nivel de directorio en la ubicación de tu aplicación.
Cuando un USUARIO inicia tu aplicación escribes en el fichero *.INI que un usuario está utilizando tu aplicación, ejemplo:
Código:

Users.ini //Nombre de fichero .ini
[Ejecución de Usuarios] //Sección
Usuarios conectador: 1 // Valores de Sección

Haces que si sales de la aplicación este valor se ponga a CERO.
Implementa la forma de que al iniciar la aplicación se lea este valor del *.INI y si Valor > CERO, deniegas el acceso. También deberías de implementar que ante cualquier excepción o salida incontrolada del programa este valor se ponga a CERO.
También tienes que controlar que cuando inicias tu aplicación el fichero *.INI debe de existir.
Por supuesto el fichero *.INI tienes que encriptarlo de alguna forma para que sea ilegible.
Si el directorio donde se encuentra tu aplicación no es privado a nivel de usuario esta forma debería funcionar sin problemas. Con ello podrías controlar incluso cuantos usuarios permites que ejecuten tu aplicación al mismo tiempo.

Espero que te sirva de algo esta sugerencia o que por lo menos te dé una idea de cómo podrías implementarlo.
También podrías utilizar un campo de la misma base de datos de tu aplicación para guardar esta información, si es que no te convence lo de los *.INI.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Isa1976 escribió:
amplio un poco más el asunto:

No te había entendido bien...

Isa1976 escribió:
Asi puedo ejecutar la aplicación solo para un usuario, ya que no me interesa tener la aplicacion corriendo en dos usuarios a la vez.

Si lo único que necesitas realmente es que solo se pueda ejecutar una instancia de tu aplicación (incluso que no permita abrirlo a la vez en otra sesión). Solo tendrías que cambiar en el "WinMain" esto:
Código:
    try
    {
        // "MyMutex" debe ser un nombre unico para tu programa
        // (no debe haber dos ejecutables con el mismo)
        // Y la parte que pone "Global\\" es la que hace que funcione en las distintas sesiones
        CreateMutex(0, 0, TEXT("Global\\MyMutex"));
        if (GetLastError())
        {
            MessageBox(Application->Handle, TEXT("El programa ya se está")
                TEXT("ejecutando (en esta u otra sesión)"), TEXT("¡Aviso!"), 0);
        }
        else
        {
            // Aqui ponemos lo que estaba originalmente dentro del primer "try"
            Application->Initialize();
            Application->CreateForm(__classid(TForm1), &Form1);
            Application->Run();
        }
    }


Isa1976 escribió:
Como puedo saber si se ha cambiado de usuario

Y si lo que quieres saber es cuando se cambia de sesión, tienes la función del API: "WTSRegisterSessionNotification". Un ejemplo de como usarla:

- Pondríamos lo siguiente en el constructor del Form principal, para indicar que queremos recibir notificaciones de los cambios de sesión:
Código:
    WTSRegisterSessionNotification(Handle, NOTIFY_FOR_THIS_SESSION);
    //O: WTSRegisterSessionNotification(Handle, NOTIFY_FOR_ALL_SESSIONS);

- Lo siguiente en el destructor:
Código:
    WTSUnRegisterSessionNotification(Handle);

- En la cabecera del Form principal, bajo el apartado privado:
Código:
private:   // User declarations

    MESSAGE void __fastcall SessionChange(TMessage& msg);
    BEGIN_MESSAGE_MAP
        VCL_MESSAGE_HANDLER(WM_WTSSESSION_CHANGE, TMessage, SessionChange);
    END_MESSAGE_MAP(inherited);

- Y en el .cpp lo implementamos:
Código:
void __fastcall TForm1::SessionChange(TMessage& msg)
{
    // Aquí recibiremos las distintas notificaciones que se muestran más abajo
    // (más detalles de cada una de ellas en la referencia del API)
    String str[10] = { "NULL", "WTS_CONSOLE_CONNECT", "WTS_CONSOLE_DISCONNECT",
        "WTS_REMOTE_CONNECT", "WTS_REMOTE_DISCONNECT", "WTS_SESSION_LOGON",
        "WTS_SESSION_LOGOFF", "WTS_SESSION_LOCK", "WTS_SESSION_UNLOCK" };
        "WTS_SESSION_REMOTE_CONTROL";
    Memo1->Lines->Add((msg.WParam < 10) ? str[msg.WParam] : String(msg.WParam));
}

- Y además añadimos lo siguiente al principio del .cpp (antes del #include<vcl.h>) (En la versión 6, en las superiores no hace falta tanto lio):
Código:
#define OLD_WIN32_WINNT _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <wtsapi32.h>
#pragma link "WtsApi32.lib"
#undef  _WIN32_WINNT
#define _WIN32_WINNT OLD_WIN32_WINNT

- Finalmente, en las opciones del proyecto:

    MENU: Project -> Options... -> Pestaña: "Directories/Conditionals" -> COMBO: "Library path"

    Añadimos la siguiente ruta:

        $(BCB)\lib\PSDK
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Esto no tiene que ver con el problema de Isa que me parece que leo ha solucionado con el mutex.
En realidad es para prevenir o al menos avisar que la solucion que propone Jesus tiene el inconveninte de que un cuelgue del ordenador o un corte de luz donde el programa no resetea el valor, luego hace imposible arrancar el programa salvo que se tenga a mano a alguien que controle el funcionamiento (no quiero quitar que sea una solucion ingeniosa para algunas cosas, solo poner en conocimiento los efectos secundarios).

Saludos,
Juanma
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.