Ir al contenido


Foto

Conocer si nuestra app se ejecuta en la sesión activa


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

#1 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 21 enero 2015 - 06:55

Puede darse el caso que que nuestra aplicación deba tomar decisiones conociendo se se ejecuta en la sesión activa. En un sistema multisesión. podemos tener más de una copia de una app ejecutándose y es posible que no nos interesen ciertas acciones si la sesión no es la activa, como me ha ocurrido a mí con un servidor udp.

Para este propósito os propongo este código compilado en delphi 7 y probado en un Win8 con 2 sesiones abiertas:

delphi
  1. uses
  2.   Windows, ShellAPI;
  3.  
  4. type
  5. WTS_SESSION_INFOA = record
  6.   SessionId:      DWORD; 
  7.   pWinStationName: PCHAR;
  8.   State:          DWORD;
  9. end;
  10. PWTS_SESSION_INFOA = ^WTS_SESSION_INFOA;
  11. PPWTS_SESSION_INFOA = ^PWTS_SESSION_INFOA;
  12. WTS_SESSION_INFO_ARRAY = array [0..0] of WTS_SESSION_INFOA;
  13. PWTS_SESSION_INFO_ARRAY = ^WTS_SESSION_INFO_ARRAY;
  14.  
  15. type
  16. WTS_PROCESS_INFOA = record
  17.   SessionId: DWORD;    // session id
  18.   ProcessId: DWORD;    // process id
  19.   pProcessName: LPSTR; // name of process
  20.   pUserSid: PSID;      // user's SID
  21. end;
  22. PWTS_PROCESS_INFOA = ^WTS_PROCESS_INFOA;
  23. PPWTS_PROCESS_INFOA = ^PWTS_PROCESS_INFOA;
  24. WTS_PROCESS_INFO_ARRAY = array [0..0] of WTS_PROCESS_INFOA;
  25. PWTS_PROCESS_INFO_ARRAY = ^WTS_PROCESS_INFO_ARRAY;
  26.  
  27. function  WTSEnumerateSessionsA(hServer: THandle; Reserved, Version: DWORD; ppSI: PPWTS_SESSION_INFOA; pCount: PDWORD): BOOL; stdcall external 'Wtsapi32.dll';
  28. function  WTSEnumerateProcessesA(hServer: THANDLE; Reserved: DWORD; Version: DWORD; ppProcessInfo: PPWTS_PROCESS_INFOA; pCount: PDWORD): BOOL; stdcall external 'Wtsapi32';
  29. procedure WTSFreeMemory(pMemory: Pointer); stdcall external 'Wtsapi32';
  30. function  ProcessIdToSessionId(dwProcessId: DWORD; var SessionId: DWORD): boolean; stdcall external 'Kernel32.dll';
  31.  
  32. function IsCurrentSession: boolean;
  33.  
  34. const
  35. WTS_CURRENT_SERVER_HANDLE = 0;
  36.  
  37.  
  38. implementation
  39.  
  40. {$R *.dfm}
  41.  
  42. // Devuelve true si el proceso actual está en la sesión activa
  43. function IsCurrentSession: boolean;
  44. var
  45.   pSi: PWTS_SESSION_INFOA;
  46.   pSiA: PWTS_SESSION_INFO_ARRAY;
  47.   Count, i: DWORD;
  48.   SessionId: DWORD;
  49. begin
  50.   pSi:= 0;
  51.   Count:= 0;
  52.  
  53.   // Obtenemos la sesión del proceso actual
  54.   ProcessIdToSessionId(GetCurrentProcessId, SessionId);
  55.  
  56.   // Obtener la lista de las sesiones
  57.   WTSEnumerateSessionsA(WTS_CURRENT_SERVER_HANDLE, 0, 1, @pSi, @Count);
  58.   pSiA:= PWTS_SESSION_INFO_ARRAY(pSi);
  59.   // Buscamos la sesión activa
  60.   for i:= 0 to Count-1 do
  61.   begin
  62.     if pSiA[i].State = 0 then break;
  63.   end;
  64.   WTSFreeMemory(pSi);
  65.  
  66.   Result:= (pSiA[i].SessionId = SessionId);
  67. end;

Puede utilizarse en una unit para usarlo en nuestros proyectos.


Saludos.
  • 0

#2 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 21 enero 2015 - 08:19

Excelente, si se me ha presentado esa situación.

Saludos.
  • 0

#3 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 21 enero 2015 - 08:41

Maestro... muchas gracias por tan interesante aporte...
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.446 mensajes
  • LocationMéxico

Escrito 21 enero 2015 - 11:09

Mas que interesante, excelente aporte amigo.

(Como todos los trucos que publicas :))

Saludos
  • 0




IP.Board spam blocked by CleanTalk.