Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: bonmario - Giugno 20, 2022, 08:19:10 am

Titolo: Simulare comportamnento ScreenSaver per inattività
Inserito da: bonmario - Giugno 20, 2022, 08:19:10 am
Ciao a tutti,
avete presente quando si imposta lo screensaver, che si può impostare la sua attivazione se il PC non viene utilizzato per "x" minuti?
Ecco, in un mio progetto, che gira solo su Windows, dovrei fare la stessa cosa.
Ho provato con l'oggetto TIdleTimer, ma da quello che ho capito, quello può misurare l'inattività solo dell'eseguibile in cui lo metto.

Avete qualche idea?

Grazie, Mario
Titolo: Re:Simulare comportamnento ScreenSaver per inattività
Inserito da: DragoRosso - Giugno 20, 2022, 11:16:54 pm
Tanto tempo fà andavo ad intercettare lo stato di IDLE del computer gestendo il messaggio di Windows (WM_SYSCOMMAND con argomento SC_SCREENSAVE), poi ho smesso in quanto lo stato di idle dell'applicazione è sufficiente per garantirti l'uso delle risorse con tranquillità.

Intercetta in un evento della tua FORM il messaggio WM_SYSCOMMAND se hai necessità di avere lo stato IDLE del PC, non ho altre idee al riguardo.

Rif: https://docs.microsoft.com/it-it/windows/win32/menurc/wm-syscommand (https://docs.microsoft.com/it-it/windows/win32/menurc/wm-syscommand)

Ciao

P.S: attenzione che lo stato IDLE del PC è abbastanza volubile come definizione, è la mancanza di attività dell'utente dopo tot tempo (però magari il PC stà bollendo con la CPU al 100%) ? Oppure è quando il PC è scarico di lavoro con la CPU al 10% ?
Per me è più aderente la definizione con la CPU scarica di attività ... però è una mia opinione.
Titolo: Re:Simulare comportamnento ScreenSaver per inattività
Inserito da: bonmario - Giugno 21, 2022, 07:59:12 am
Ok, grazie, ci provo
Titolo: Re:Simulare comportamnento ScreenSaver per inattività
Inserito da: bonmario - Giugno 25, 2022, 07:39:13 am
Ciao,
in questi giorni, sul forum internazionale, hanno aperto questa discussione:
https://forum.lazarus.freepascal.org/index.php/topic,59678.msg445443/topicseen.html#new

Partendo da lì, e facendo qualche ricerca, ho trovato questo codice:
Codice: [Seleziona]
    function IdleTime: DWord;
    var
      LastInput: TLastInputInfo;
    begin
      LastInput.cbSize := SizeOf(TLastInputInfo);
      GetLastInputInfo(LastInput);
      Result:=(GetTickCount - LastInput.dwTime) div 1000;
      //Result contiene il numero di secondi passati dall'ultima volta che è stato rilevato un input (mouse o tastiera)
    end;

Basta aggiungere alla uses "jwawinuser".

Jo fatto qualche prova, e funziona alla grande !!

Ciao, Mario
Titolo: Re:Simulare comportamnento ScreenSaver per inattività
Inserito da: DragoRosso - Giugno 25, 2022, 12:34:59 pm
Conosco quella funzione, ma funziona solo parzialmente a come pensi tu.

GetLastInputInfo lavora solo nella sessione utente da cui viene chiamato. Se entro come Terminal Server o con i vari servizi più o meno multiutente di teleassistenza, le sessioni sono diversificate. Se il il tuo software gira su un server (o su sistemi Windows abilitati alla multisessione), l'input utente sarà quello della sessione su cui gira il software. Penso che accada la stessa cosa con il "multidesktop" di Windows (cioè se hai 2 desktop e il tuo software "gira" sul primo, ma l'utente stà lavorando sul secondo, l'input il tuo software non lo intercetta).
Avevo in passato già verificato la cosa, ma magari ora hanno cambiato il funzionamento.
Quella API inoltre non funziona nei servizi, in quanto per un servizio non esiste una sessione interattiva.

Se non hai le problematiche di cui sopra comuqnue è un ottima soluzione.

Ciao

Titolo: Re:Simulare comportamnento ScreenSaver per inattività
Inserito da: DragoRosso - Luglio 10, 2022, 09:24:27 pm
...
Penso che accada la stessa cosa con il "multidesktop" di Windows (cioè se hai 2 desktop e il tuo software "gira" sul primo, ma l'utente stà lavorando sul secondo, l'input il tuo software non lo intercetta).
Avevo in passato già verificato la cosa, ma magari ora hanno cambiato il funzionamento.
...

Approfittando di un altro post simile su altro forum, ho fatto alcune prove e anche con il multidesktop di Windows (almeno di Windows 11) la funzione GetLastInputInfo funziona correttamente a livello globale, ossia su qualunque desktop si lavori e ovunque giri l'app che usa tale funzione verrà intercettato il tasto o il movimento del mouse.

Ciao