È necessario disabilitare lo screen saver / blocco schermo in Windows C # /. Net [chiuso]

StackOverflow https://stackoverflow.com/questions/241222

  •  04-07-2019
  •  | 
  •  

Domanda

Per una particolare applicazione, ho bisogno che lo screen saver sia disabilitato mentre è in esecuzione. L'operatore POTREBBE spegnerlo manualmente, quindi riaccenderlo in seguito, ma la cosa più semplice da fare sarebbe tenere a bada lo screen saver mentre l'applicazione è in esecuzione.

Come posso farlo? Ho trovato il codice per disattivare effettivamente lo screen saver con SPI_SETSCREENSAVEACTIVE, ma non credo sia quello che voglio.

È stato utile?

Soluzione

theoldnewthing ha la tua risposta: usa SetThreadExecutionState (ES_DISPLAY_REQUIRED) .

Viene utilizzato da lettori video e PowerPoint.

Altri suggerimenti

[FlagsAttribute]
public enum EXECUTION_STATE : uint
{
    ES_SYSTEM_REQUIRED = 0x00000001,
    ES_DISPLAY_REQUIRED = 0x00000002,
    // Legacy flag, should not be used.
    // ES_USER_PRESENT   = 0x00000004,
    ES_AWAYMODE_REQUIRED = 0x00000040,
    ES_CONTINUOUS = 0x80000000,
}

public static class SleepUtil
{
    [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
}

public void PreventSleep()
{
    if (SleepUtil.SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS
        | EXECUTION_STATE.ES_DISPLAY_REQUIRED  
        | EXECUTION_STATE.ES_SYSTEM_REQUIRED 
        | EXECUTION_STATE.ES_AWAYMODE_REQUIRED) == 0) //Away mode for Windows >= Vista
        SleepUtil.SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS
            | EXECUTION_STATE.ES_DISPLAY_REQUIRED 
            | EXECUTION_STATE.ES_SYSTEM_REQUIRED); //Windows < Vista, forget away mode
}

Credito: P / Invoke , punto morto

SystemParametersInfo con SPI_SETSCREENSAVEACTIVE è il modo normale per farlo. Tuttavia, non disabilita il blocco dello schermo.

SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS
            | EXECUTION_STATE.ES_DISPLAY_REQUIRED 
            | EXECUTION_STATE.ES_SYSTEM_REQUIRED);

Questo non è utile su XP.

In effetti, questa funzione non è utilizzabile in modo incrociato tra diverse versioni di Windows (sebbene funzioni abbastanza bene in Windows Vista o versioni successive) ... In Windows XP / 2003 questa funzione deve essere chiamata con ES_USER_PRESENT | ES_CONTINUOUS (entrambi dovrebbero essere chiamati) ... Questo ripristinerà periodicamente sia il sistema che i timer di inattività ... In altre versioni di Windows, si consiglia di utilizzare ES_SYSTEM_REQUIRED | ES_DISPLAY_REQUIRED | ES_CONTINUOUS | ES_AWAYMODE_REQUIRED ...

prova a rendere il tuo modulo il valore più alto vero funziona per me lo screen saver non è mai arrivato anche dopo il tempo di inattività ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top