Come verificare se il programma è in esecuzione nella console locale?
Domanda
In Windows Server 2003, come posso verificare se il mio programma è in esecuzione nella console locale (" sullo schermo della macchina server ") anziché nella sessione remota?
Sto usando Delphi Win32, quindi qualsiasi metodo basato su API Windows dovrebbe funzionare ..
Soluzione
Il numero di sessione non te lo direbbe?
ProcessIdToSessionId (GetCurrentProcessId (), & amp; dwSessionNum)
Dovresti controllare anche la versione del sistema operativo, usando GetVersionEx: per tutto fino a XP / Server 2003 la sessione 0 è locale (servizio o console interattiva), qualsiasi cosa superiore è virtuale. Per Vista / 2008 le sessioni 0 e 1 sono entrambe locali (0 è servizio, 1 è console), tutto il resto è virtuale.
Suppongo che le tue unità Delphi dichiarerebbero il numero di sessione come var, quindi non avresti bisogno della e commerciale.
Altri suggerimenti
WTSGetActiveConsoleSessionId () dovrebbe restituire il ID della sessione collegata alla console. È quindi possibile confrontare quell'ID sessione con l'ID sessione corrente dell'applicazione per determinare se si sta eseguendo o meno sulla console. Vista (non sono sicuro di Windows Server 2008) non fornisce necessariamente alla sessione della console l'ID 1 (Cambio rapido utente, nessuno?).
Per me, ProcessIdToSessionId ha restituito 0 sia quando eseguito direttamente sulla console fisica sia quando è stato effettuato l'accesso alla sessione amministrativa (mstsc / admin).
Tuttavia, quando accedi tramite RDP, Windows (XP Pro in questo caso) crea una nuova sessione che mostra sulla console fisica che ha appena il "questo computer è bloccato". display. WTSGetActiveConsoleSessionId restituisce l'id di sessione per quella seconda sessione che nel mio caso era 2.
Quindi, anche se l'app è in esecuzione sulla console, ora ci sono due sessioni della console e l'app non è in esecuzione su quella attiva. Nel mio codice, invece, confronto l'id di sessione con 0.
Brian ha ragione, da allora ho riscontrato Vista che riportava un ID sessione di 2 per una console interattiva, nonostante il Cambio rapido utente non fosse in uso. Certo, questo potrebbe essere solo un bug :-)