Ir al contenido


Foto

[RESUELTO] Como evitar que mi aplicacion se abra 2 veces en la misma pc


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

#21 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 01 febrero 2011 - 01:37


¿Y qué sabéis del gremlin? A mí me paso hace unas semanas en un mensaje cada vez que lo editaba, me dí cuenta de que todas las barras '' me habían desaparecido  :| :| :|

Pues yo lo he notado con Chrome y FireFox, tiene que ver con pegar texto con el caracter ''. Al parecer puede ser problema del foro y se está estudiando una actualización. ;)

Al citar tu mensaje me ha borrado el carácter en cuestión y he tenido que reconstituirlo. Ahora estoy usando Chrome.

Saludos.


Escribo ahora desde IExplorer y no me ha quitado las barras, el problema me lo da desde Firefox. Puedo asegurar que no era tras copiar y pegar, ni tras insertar una cita, simplemente al editar el mensaje eliminaba las barras  :|

Saludos

RECTIFICO: Ahora estoy editando desde IExplorer, y me acaba de quitar las barras (lo podéis ver en el texto "quoteado")
  • 0

#22 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 01 febrero 2011 - 06:09

Pues funciona de maravilla, gracias a dios por haberte hecho tan inteligente y por permitirme conocerte por medio de este foro (y) . Despues de todos estos halagos, viene otra inquietud. :angel: Tengo unos procedimientos que al minimizar el formulario principal, lo ubican como un icono al lado del reloj. Al usar la funcion que indicas, si lo tengo minimizado de esa forma, no se restaura la ventana. Aqui van los procedimientos:



delphi
  1. procedure Minimizar;
  2. begin
  3. with FRMactivasred.IconData do
  4. begin
  5. cbSize := sizeof(FRMactivasred.IconData );
  6. Wnd :=  FRMactivasred.Handle;
  7. uID := 100;
  8. uFlags := NIF_MESSAGE + NIF_ICON + NIF_TIP;
  9. uCallbackMessage := WM_USER + 1;
  10. // Usamos de icono el mismo de la aplicación
  11. hIcon := Application.Icon.Handle;
  12. // Como Hint del icono, el nombre de la aplicación
  13. StrPCopy( szTip, Application.Title );
  14. end;
  15. // Ponemos el icono al lado del reloj
  16. Shell_NotifyIcon( NIM_ADD, @FRMactivasred.IconData );
  17. // Ocultamos el formulario
  18. FRMactivasred.Hide;
  19. end;
  20.  
  21. procedure TFRMactivasred.Mostrar1Click( Sender: TObject );
  22. begin
  23. // Volvemos a mostrar de nuevo el formulario
  24. FRMactivasred.Show;
  25. ShowWindow( Application.Handle, SW_SHOW );
  26. // Eliminamos el icono de la bandeja del sistema
  27. Shell_NotifyIcon( NIM_DELETE, @IconData );
  28. IconData.Wnd := 0;
  29. end;
  30.   procedure  TFRMactivasred.WMSysCommand( var Msg: TWMSysCommand );
  31. begin
  32. if Msg.CmdType = SC_MINIMIZE then
  33. Minimizar
  34. else
  35. DefaultHandler( Msg );
  36. end;
  37. procedure TFRMactivasred.Restaurar( var Msg: TMessage );
  38. var p: TPoint;
  39. begin
  40. // ¿Ha pulsado el botón izquierdo del ratón?
  41. if Msg.lParam = WM_LBUTTONDOWN then
  42. FRMactivasred.mostrar1click( Self );
  43. // ¿Ha pulsado en la bandeja del sistema con el botón derecho del ratón?
  44. if Msg.lParam = WM_RBUTTONDOWN then
  45. begin
  46. SetForegroundWindow( Handle );
  47. GetCursorPos( p );
  48. FRMactivasred.menubandeja.Popup( p.x, p.y );
  49. PostMessage( Handle, WM_NULL, 0, 0 );
  50. end;
  51. end;



Ademas de analizar si es la mejor forma de hacerlo, dime que puedo hacer para restaurar el formulario cuando esta minimizado de esta manera y tratan de abrir el programa.

gracias por adelantado. 

(y)
  • 0

#23 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 01 febrero 2011 - 08:34

........ Despues de todos estos halagos, viene otra inquietud. ........


:D :D :D vaya amigo Luciano, que diplomático jejejeje

Salud OS
  • 0

#24 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 01 febrero 2011 - 09:01

........ Despues de todos estos halagos, viene otra inquietud. ........


:D :D :D vaya amigo Luciano, que diplomático jejejeje

Salud OS


Asi soy yo con mi amigo Escafandra (y)

Por otro lado, en la funcion de escafandra, donde debo ponerle el nombre de la aplicacion que quiero que se restaure, porque si tengo minimizadas varias aplicaciones, como ibexpert u otras, todas se restauran.


  • 0

#25 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 febrero 2011 - 07:13


........ Despues de todos estos halagos, viene otra inquietud. ........


    vaya amigo Luciano, que diplomático jejejeje

Salud OS


Asi soy yo con mi amigo Escafandra 

Caramba, si que son alagos y diplomacia internacional, qué barbaridad.   

Por otro lado, en la funcion de escafandra, donde debo ponerle el nombre de la aplicacion que quiero que se restaure, porque si tengo minimizadas varias aplicaciones, como ibexpert u otras, todas se restauran.


Te explico. La función está diseñada para usar el Path completo de la aplicación como semilla para crear el mutex. Un archivo sólo puede tener una única ruta en un PC. La limitación que podemos tener es que tengamos dos copias del programa en rutas diferentes, en ese caso lo considera distintas aplicaciones pues los mutex no coincidirán.

En la función que he escrito, enumero todas las ventanas del sistema para buscar el proceso que tenga el mutex de nuestra aplicación. Para encontar el Path del proceso de cada ventana uso la API GetWindowModuleFileName. Esta API no funciona muy bien cuando se la llama para encontrar el Path de una ventana de otra aplicación, así que otras aplicaciones escritas en delphi o builder pueden interferir. Para resolver este problema he escrito otra función que devuelve con fiabilidad el nombre completo del ejecutable de un proceso.

Podría escogerse otra forma de calcular el mutex, pero vamos a seguir con el mismo sistema.

Para no complicar mucho la cosa publico de nuevo el código tal como quedaría con la modificación:



delphi
  1. program Project1;
  2.  
  3. uses
  4.   Windows, Forms, Tlhelp32,
  5.   Unit1 in 'Unit1.pas' {Form1};
  6.  
  7. {$R *.res}
  8. var
  9.   Buffer: array [0..MAX_PATH] of char;
  10.   c:      PCHAR;
  11.   Mutex:  THandle;
  12.   Pid:    DWORD;
  13.  
  14.  
  15. function GetProcessImageFileName(PId: DWORD; ExePath: PCHAR; Size: integer): boolean;
  16. var
  17.   hSnapshot: THandle;
  18.   ModEntry:  MODULEENTRY32;
  19. begin
  20.   Result:= True;
  21.   if (PId = 0) and (Size > 0) then
  22.   begin
  23.     ExePath[0]:= #0;
  24.     exit;
  25.   end;
  26.   ModEntry.dwSize:= sizeof(MODULEENTRY32);
  27.   Result:= false;
  28.   if Size>0 then ExePath[0]:= #0;
  29.   hSnapshot:= CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PId);
  30.   if hSnapshot <> -1 then
  31.   begin
  32.     if Module32First(hSnapshot, ModEntry) then
  33.     begin
  34.       Result:= true;
  35.       lstrcpyn(ExePath, ModEntry.szExePath, Size);
  36.     end;
  37.     CloseHandle(hSnapshot);
  38.   end;
  39. end;
  40.  
  41. function EnumWindowsProc(Handle: Thandle; lParam: LPARAM): BOOL; stdcall;
  42. var
  43.   Mutex: THandle;
  44. begin
  45.   Result:= true;
  46.   GetWindowThreadProcessId(Handle, Pid);
  47.   if GetCurrentProcessId <> Pid then
  48.   begin
  49.     if GetProcessImageFileName(Pid, @Buffer, sizeof(Buffer)) then
  50.     begin
  51.       c:= Buffer;
  52.       repeat Inc(c); if c^ = '\' then c^:= '*'; until c^ = #0;
  53.       Mutex:= CreateMutex(nil, FALSE, Buffer);
  54.       GetClassName(Handle, Buffer, Sizeof(Buffer));
  55.       if (GetLastError <> 0) and (lstrcmp('TApplication', Buffer) = 0) then
  56.       begin
  57.         ShowWindow(Handle, SW_RESTORE);
  58.         SetForegroundWindow(Handle);
  59.       end;
  60.       if Mutex <> 0 then CloseHandle(Mutex);
  61.     end;
  62.   end;
  63. end;
  64.  
  65. begin
  66.   GetModuleFileName(0, Buffer, MAX_PATH);
  67.   c:= Buffer;
  68.   repeat Inc(c); if c^ = '\' then c^:= '*'; until c^ = #0;
  69.   Mutex:= CreateMutex(nil, FALSE, Buffer);
  70.   if GetLastError <> 0 then
  71.   begin
  72.     EnumWindows(@EnumWindowsProc, 0);
  73.     exit;
  74.   end;
  75.  
  76.  
  77.   Application.Initialize;
  78.   Application.CreateForm(TForm1, Form1);
  79.   Application.Run;
  80.  
  81.  
  82.   if Mutex <> 0 then CloseHandle(Mutex);
  83. end.




Saludos.

Edito para reparar etiqueta de código.
  • 0

#26 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 02 febrero 2011 - 10:15

funciona perfecto gracias  (y) 

recibo estos dos warnings:

[Warning] Pmonitoreofirebird.dpr(46): Comparison always evaluates to True
[Warning] Pmonitoreofirebird.dpr(46): Comparing signed and unsigned types - widened both operands


Pd. sobre la inquietud de restaurarlo cuando esta minimizado al lado del reloj, como te indico en un mensaje anterior. Hay algo que se pueda hacer? :huh:
  • 0

#27 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 02 febrero 2011 - 12:44

funciona perfecto gracias  (y) 

recibo estos dos warnings:

[Warning] Pmonitoreofirebird.dpr(46): Comparison always evaluates to True
[Warning] Pmonitoreofirebird.dpr(46): Comparing signed and unsigned types - widened both operands


Es una advertencia en un casting. Se soluciona cambiando


delphi
  1. if hSnapshot <> -1 then


por


delphi
  1. if hSnapshot <> THandle(-1) then


pero no afecta al buen funcionamiento.

Pd. sobre la inquietud de restaurarlo cuando esta minimizado al lado del reloj, como te indico en un mensaje anterior. Hay algo que se pueda hacer? :huh:


Debes capturar el Mensaje SW_RESTORE en la aplicación y restaurar la vetana.

Por otra parte he probado un ejemplo con el componente SysTrayIcon que publiqué hace ya algún tiempo, y funciona perfectamente sin tener que capturar SW_RESTORE, pues de esa taréa ya se encarga el componente.

Saludos.
  • 0

#28 luk2009

luk2009

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.040 mensajes
  • LocationSanto Domingo

Escrito 02 febrero 2011 - 01:40

Gracias de nuevo Escafandra. Siempre tienes las respuestas correctas, aunque realmente tu codigo prefiero entenderlo de a poquito, Porque la verdad es que tus codigos son un indicador de lo mucho que me falta por aprender. Por suerte cuento  con personas como tu.
  • 0




IP.Board spam blocked by CleanTalk.