Ver Mensaje Individual
  #5  
Antiguo 17-09-2003
dabas dabas is offline
Miembro
 
Registrado: jun 2003
Ubicación: En mi casa
Posts: 39
Reputación: 0
dabas Va por buen camino
Post

Perfecto, no se que haria sin vosotros.

Esto es lo que he usado (Trucomania):

Añade 'TLHelp32' en el uses de tu form.
Añade esta función en el implementation de la form:
Código:
 function ProgramaAbiertoDosVeces:Boolean;
 var
   Datos          :TProcessEntry32; {Estructura interna de datos de un proceso}
   hID            : DWord;           {identificador del proceso}
   Snap           :Integer;
   NombreArchivo  :String;    {path del archivo original}
   Repetido       :Boolean;   {true si el programa se ha abierto dos veces}
   Handle1        :Hwnd;      {thandle}
   Contador       :Integer;   {Contador de aperturas}

 begin
   Contador:=0;
   NombreArchivo:=Application.Exename;
   Repetido:=False;
   GetWindowThreadProcessId(Handle1,@hID);
   Snap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
   try
     Datos.dwSize:=SizeOf(Datos);
     if(Process32First(Snap,Datos))then
     begin
       repeat
         if NombreArchivo=StrPas(Datos.szExeFile) then
         begin
            Inc(contador);
            if Contador>=2 then Repetido:=true;
         end;
       until (not(Process32Next(Snap,Datos))) or (Repetido);
     end;
   finally
     Windows.CloseHandle(Snap);
   end;
   Result:=Repetido;
 end;
Nota: lo malo que "Application.Exename" a mi me devuelve la ruta completa. Lo cambié por el nombre de mi programa.
Ahora, pon este código en el evento OnCreate de la form principal:
Código:
 procedure TForm1.FormCreate(Sender: TObject);
 begin
   if ProgramaAbiertoDosVeces then
   begin
    showmessage('El programa ha sido abierto mas de una vez');
    Application.terminate;
   end;
 end;
Ahi queda eso. Hasta otra foroadictos
Responder Con Cita