c # - SetThreadExecutionState virker ikke, når den kaldes fra Windows-tjenesten

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil forhindre, at systemet går i seng/dvale fra en windows service.
Jeg ringer SetThreadExecutionState funktion til at gøre det.
Men det ser ud til at have ingen effekt.
Jeg vil bare vide, om funktionen SetThreadExecutionState vil bruges til Windows-tjenester. Hvis ikke, hvad vil der være de alternative måder til det.


Nedenfor er den C # kode, jeg bruger. Jeg kalder det på Onstart metode for service.


[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern uint SetThreadExecutionState(EXECUTION\_STATE esFlags);
private void KeepAlive() 
{
     SetThreadExecutionState(EXECUTION\_STATE.ES\_DISPLAY\_REQUIRED | EXECUTION\_STATE.ES\_SYSTEM\_REQUIRED | EXECUTION\_STATE.ES\_CONTINUOUS)
}

Bedste reference



  Opkald SetThreadExecutionState uden ES\_CONTINUOUS nulstiller bare idle timeren; For at holde displayet eller systemet i driftstilstand skal tråden kalde SetThreadExecutionState med jævne mellemrum.



(Kilde) [5]


Du skal ringe til denne funktion nu og da. Det er ikke en ild og glemme.

Andre referencer 1


SetThreadExecutionState er kun gyldig for den tråd, der kalder den. Hvis det kaldes i en arbejdstråd, selv med ES\_CONTINUOUS, når arbejdstrådens tråd er død, er indstillingen ikke længere gyldig, og derefter bliver pauseskærmen tændt igen.


Kaldning af denne API fra en timer vil vække en arbejdstråd, før den foregående tråd er død, og derfor får den det til at fungere.


Så hvis du kalder SetThreadExecutionState i din hovedtråd, ligesom UI-tråd i klientprogrammer, behøver du ikke timer.