È necessario disabilitare lo screen saver / blocco schermo in Windows C # /. Net [chiuso]
-
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.
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à ...