Para este propósito os propongo este código compilado en delphi 7 y probado en un Win8 con 2 sesiones abiertas:
delphi
uses Windows, ShellAPI; type WTS_SESSION_INFOA = record SessionId: DWORD; pWinStationName: PCHAR; State: DWORD; end; PWTS_SESSION_INFOA = ^WTS_SESSION_INFOA; PPWTS_SESSION_INFOA = ^PWTS_SESSION_INFOA; WTS_SESSION_INFO_ARRAY = array [0..0] of WTS_SESSION_INFOA; PWTS_SESSION_INFO_ARRAY = ^WTS_SESSION_INFO_ARRAY; type WTS_PROCESS_INFOA = record SessionId: DWORD; // session id ProcessId: DWORD; // process id pProcessName: LPSTR; // name of process pUserSid: PSID; // user's SID end; PWTS_PROCESS_INFOA = ^WTS_PROCESS_INFOA; PPWTS_PROCESS_INFOA = ^PWTS_PROCESS_INFOA; WTS_PROCESS_INFO_ARRAY = array [0..0] of WTS_PROCESS_INFOA; PWTS_PROCESS_INFO_ARRAY = ^WTS_PROCESS_INFO_ARRAY; function WTSEnumerateSessionsA(hServer: THandle; Reserved, Version: DWORD; ppSI: PPWTS_SESSION_INFOA; pCount: PDWORD): BOOL; stdcall external 'Wtsapi32.dll'; function WTSEnumerateProcessesA(hServer: THANDLE; Reserved: DWORD; Version: DWORD; ppProcessInfo: PPWTS_PROCESS_INFOA; pCount: PDWORD): BOOL; stdcall external 'Wtsapi32'; procedure WTSFreeMemory(pMemory: Pointer); stdcall external 'Wtsapi32'; function ProcessIdToSessionId(dwProcessId: DWORD; var SessionId: DWORD): boolean; stdcall external 'Kernel32.dll'; function IsCurrentSession: boolean; const WTS_CURRENT_SERVER_HANDLE = 0; implementation {$R *.dfm} // Devuelve true si el proceso actual está en la sesión activa function IsCurrentSession: boolean; var pSi: PWTS_SESSION_INFOA; pSiA: PWTS_SESSION_INFO_ARRAY; Count, i: DWORD; SessionId: DWORD; begin pSi:= 0; Count:= 0; // Obtenemos la sesión del proceso actual ProcessIdToSessionId(GetCurrentProcessId, SessionId); // Obtener la lista de las sesiones WTSEnumerateSessionsA(WTS_CURRENT_SERVER_HANDLE, 0, 1, @pSi, @Count); pSiA:= PWTS_SESSION_INFO_ARRAY(pSi); // Buscamos la sesión activa for i:= 0 to Count-1 do begin if pSiA[i].State = 0 then break; end; WTSFreeMemory(pSi); Result:= (pSiA[i].SessionId = SessionId); end;
Puede utilizarse en una unit para usarlo en nuestros proyectos.
Saludos.