Comment interdir l'arrêt et la mise en veille par le code ?

Résolu
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 - 20 janv. 2012 à 14:21
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 - 21 janv. 2012 à 16:28
Bonjour,

Toujours pour ma pointeuse, il me reste à interdir l'extinction de l'ordinateur et interdir sa mise en veille dans le code de l'application et durant le fonctionnement de cette dernière, avez-vous une idée, ou plusieurs ?

(vbNet10 sur PC (xp, vista, seven (32/64))

Merci, cordialement, Joe.

21 réponses

Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
21 janv. 2012 à 11:02
Désolé, je ne peux que te faire un copier-coller du code suivant qui m'à tout l'air d'être du C:

  
public enum EXECUTION_STATE :uint
{
     ES_AWAYMODE_REQUIRED = 0x00000040,
     ES_CONTINUOUS = 0x80000000,
     ES_DISPLAY_REQUIRED = 0x00000002,
     ES_SYSTEM_REQUIRED = 0x00000001
     // Legacy flag, should not be used.
     // ES_USER_PRESENT = 0x00000004
}
void PreventMonitorPowerdown ()
    {
        SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED | EXECUTION_STATE.ES_CONTINUOUS);
    }

    void AllowMonitorPowerdown ()
    {
        SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);
    }

    void PreventSleep ()
    {
        // Prevent Idle-to-Sleep (monitor not affected) (see note above)
        SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_AWAYMODE_REQUIRED);
    }

    void KeepSystemAwake ()
    {
        SetThreadExecutionState(EXECUTION_STATE.ES_SYSTEM_REQUIRED);
    }


et voici les notes tirés du même site que ci-dessus:
There is no need to store the state you set, Windows remembers it for you. Just set it back to ES_CONTINUOUS when you don't want it anymore.

Also note that this setting is per thread/application not global, so if you go to ES_CONTINUOUS and another app/thread is still setting ES_DISPLAY the display will be kept on.

Note that the return value is the EXECUTION_STATE that ''was'' set.


Note ES_AWAYMODE_REQUIRED:
Although Away Mode is supported on any Windows Vista PC, the mode must be explicitly allowed by the current power policy. The Allow Away Mode power setting enables the user to selectively allow Away Mode on one or more power plans or individually for AC and DC (on battery) power states.
(see more about this at http://msdn.microsoft.com/en-us/windows/hardware/gg463208.aspx )

Sinon, l'API renvoie l'état actuel au 1er appel et NULL en cas d'échec (MSDN).

Voilà j'espère que tu en pourras en tirer quelque chose.
Calade
3
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
21 janv. 2012 à 16:28
Bonsoir à tous,

Merci d'avoir contribué, j'ai enfin trouvé (en grande prtie grâce à vous), dans un code conforme à vbNet, ça marche, voici le code :

Public Class Form1
  Private Declare Function SetThreadExecutionState Lib "kernel32" (ByVal esFlags As Int32) As Int32
  Public Enum EXECUTION_STATE As Integer
    ES_CONTINUOUS = &H80000000
    ES_DISPLAY_REQUIRED = &H2
    ES_SYSTEM_REQUIRED = &H1
    ES_AWAYMODE_REQUIRED = &H40
  End Enum

  Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS) ' go
  End Sub

  Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED Or EXECUTION_STATE.ES_CONTINUOUS) ' stop
  End Sub
End Class


Merci encore, cordialement, Joe.
3
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
21 janv. 2012 à 09:30
Bonjour,

Ton problème m'intéresse aussi mais en VB6.

J'ai trouvé 2 réponses avec Google

- La 1ère avec les API, ce qui me parait beaucoup plus propre que...
- La 2nde qui attaque la base de registre qui nécessite souvent un reboot et j'imagine que ce n'est pas ce que tu recherches.


Calade
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
21 janv. 2012 à 09:38
Bonjour Calade et merci...

Non, en effet, la BDR est toujours problèmatique, notamment à cause des blocages et permissions, sans omettre le risque d'erreur...

La solution API, oui, d'autant que vbNet reprend un grand nombre des API dans son code via ses classes : je veux bien si tu veux à ton tour me la recopier ici car pour aller sur le site des dictateurs mégalomanes "d.com", faut que j'y aille en ip anonyme.

Au plaisir, cordialement. Joe.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
21 janv. 2012 à 09:43
Rebonjour,

Pas de dictature sur ce site qui n'a rien avec Stevie et Bill, mais celui de notre estimée confrère developpez.com

Pour empêcher la mise en veille:
SetThreadExecutionState(ES_CONTINUOUS or ES_SYSTEM_REQUIRED);

pour forcer l’extinction de l'écran:
SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, 1);

Have Fun

Calade
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
21 janv. 2012 à 10:35
Suite...

Puis-je avoir un exemple de code fonctionnel pour :


Pour empêcher la mise en veille:
SetThreadExecutionState(ES_CONTINUOUS or ES_SYSTEM_REQUIRED)


Et puis, de la même façon, remettre en l'état à la sortie du programme ?

*

Pour l'extinction de l'écran, c'est plutôt le contraire que je voudrais, mais pas de l'écran, non, de l'ordinateur, à savoir "interdir l'extinction de l'ordinateur" ?

*

Pour ton estimé kmaraden, c'est une société multi-nationale américaine qui fait travailler gratuitement les contributeur français et se fait de l'argent sur leur dos grâce à la fréquentation générée par ces derniers, ce qui permet de vendre des espaces publicitaires, ici :

ICI

*

Au plaisir, cordialement, Joe.
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
21 janv. 2012 à 11:21
Suite...

Bon, en C, en anglais, je ne vois même pas la déclaration de l'API, inexploitable pour moi (dans un forum VbNet en français).

Toutefois je vais chercher dans mon catalogue d'API, merci de m'avoir mis sur cette voie.

Cordialement, Joe.
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
21 janv. 2012 à 11:32
Te moi, je ne connais pas .NET, que VB6 mais utilisable tel que:

If SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_AWAYMODE_REQUIRED) > 0 Then
' OK
Else
' NOT OK
endif

enfin, je n'ai pas fait d'essais, ça doit être ça. Regarde les remarques du MSDN pour en savoir plus. Il est possible que certaines options ne marchent pas selon ton windows.

Calade
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
21 janv. 2012 à 11:41
Oui mais, si c'est une API, il doit y avoir son entête péalablement, or là il n'y a rien, mais j'ai néanmoins le nom de l'API (SetThreadExecutionState)

Cordialement, Joe.
0
Profil bloqué
21 janv. 2012 à 11:49
voici la déclaration en VB Net de l'Api

<DllImport("kernel32.dll", _
SetLastError:=True, _
CallingConvention:=CallingConvention.StdCall)> _
Public Shared Function SetThreadExecutionState( _
ByVal esFlags As Integer) As Integer
End Function

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
21 janv. 2012 à 11:51
La déclaration:
Private Declare Sub SetThreadExecutionState Lib "kernel32.dll" (ByRef esFlags As EXECUTION_STATE)



Calade
0
Profil bloqué
21 janv. 2012 à 12:13
Pour compléter la déclaration en VB Net

<StructLayout(LayoutKind.Sequential)> _
Public Structure EXECUTION_STATE
Public Value As Integer
End Structure


Évidemment le paramètre n'est plus un integer !


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
21 janv. 2012 à 12:29
Cher Galain,

Merci de ta science, je dois avouer que je n'y comprends absolument pas grand chose, déjà ton truc l'éditeur n'en veu pas :

Public Class Form1

<DllImport("kernel32.dll", _ 
SetLastError:=True, _ 
CallingConvention:=CallingConvention.StdCall)> _ 
Public Shared Function SetThreadExecutionState( _ 
ByVal esFlags As Integer) As Integer 
End Function


Public Class Form1

Par contre il veut bien de celui que j'ai trouvé grâce au tien :

Private Declare Function SetThreadExecutionState Lib "kernel32" (ByVal esFlags As Int32) As Int32

  Public Enum EXECUTION_STATE As Integer
    ES_CONTINUOUS = &H80000000
    ES_DISPLAY_REQUIRED = &H2
    ES_SYSTEM_REQUIRED = &H1
    ES_AWAYMODE_REQUIRED = &H40
  End Enum


Avec comme utilisation :

SetThreadExecutionState (EXECUTION_STATE.ES_DISPLAY_REQUIRED Or EXECUTION_STATE.ES_CONTINUOUS)
' écran de veille STOP 

SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS)
' écran de veille OK


En fait je ne comprend pas ici pourquoi il y a deux commandes :

EXECUTION_STATE.ES_DISPLAY_REQUIRED 
Or 
EXECUTION_STATE.ES_CONTINUOUS


C'est quoi cs deux directives, pourqoi deux, ne peut-on en enlever une ?

Ce que je cherche, c'est en début de programme = pas de veille, et en fin de programme remise en l'état du paramétrage utilisateur.

Aurais-tu quelques précisions ?

Merci, cordialement, Joe.
0
Calade Messages postés 1207 Date d'inscription dimanche 20 avril 2003 Statut Membre Dernière intervention 4 juin 2016 10
21 janv. 2012 à 12:34
l'éditeur n'en veu pas

Que veux-tu dire exactement par là/

Juste une question, es-tu sur d'être en VB .NET et NON en VB6 ?

Calade
0
Profil bloqué
21 janv. 2012 à 13:39
bonjour EhJoe

Si l'éditeur accepte tes déclarations et refuse les miennes c'est que tu es en VB 6.0 et non en VB Net !
Or dans l'intitulé de ton post c'est précisé VB Net et VB 2005 : en fait c'est VB Net ! Attention à bien choisir le langage exact !

Bonne prog

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
Profil bloqué
21 janv. 2012 à 14:08
bonjour EhJoe

Je viens d'essayer le code sur un de mes programmes en VB Net ! Il remplit correctement son rôle : autoriser ou interdire le lancement de l'écran de veille et ceci avec les déclarations VB Net que je t'ai données!

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
21 janv. 2012 à 15:18
Ahhhhhhh...

Y a une différence entre vb6 et vbNet, ben alors, j'en apprends tous les jours, pas étonnant...

En fait je demandais, mais j'ai mal lu la réponse :

SetThreadExecutionState (EXECUTION_STATE.ES_DISPLAY_REQUIRED Or EXECUTION_STATE.ES_CONTINUOUS)


QUESTION PREMIERE
Est-ce pour arrêter ou pour mettre en marche cette commande ci-dessus je te prie ?


QUESTION SECONDEEXECUTION_STATE.ES_DISPLAY_REQUIRED
EXECUTION_STATE.ES_CONTINUOUS
C'est quoi la différence entre ces deu commande, pourquoi deux commande, à quoi servent-elles, peut-on en enlever une ?

QUESTION TROISIEME
SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS)

C'est pour mettre en marche ou pour arrêter l'intrdiction d'écran de veille ?


REPONSE ULTIME,
quand je fais ça :

Imports System.Runtime.InteropServices
Public Class Form1
  <StructLayout(LayoutKind.Sequential)> _
  Public Structure EXECUTION_STATE
    Public Value As Integer
  End Structure
End Class


Cette fois ça marche, faudrait pas oublier de me dire de mettre les bonnes entêtes car je ne suis pas kakir...

MAIS ENSUITE

J'écris quoi pour lancer et pour arrêter l'écran de veille au moment où je le veux ?

Ne pas oublier les trois question du dessus

Chers amis, au plaisir de vous lire, merci d'avance, cordialement, Joe.
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
21 janv. 2012 à 15:22
suite de suite, désolé pour les fautes, mais comme on ne peut pas modifier ses messages, ah ben... même la mise en forme n'a pas été respecté...
0
Profil bloqué
21 janv. 2012 à 15:27
Public Class Introfrm

    Private Enum EXECUTION_STATE As Integer
        ES_CONTINUOUS = &H80000000
        ES_DISPLAY_REQUIRED = &H2
        ES_SYSTEM_REQUIRED = &H1
        ES_AWAYMODE_REQUIRED = &H40
    End Enum

    Private Sub Intro_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Commande.Top = (Me.Height - Commande.Height) \ 2
        Commande.Left = (Me.Width - Commande.Width) \ 2

    End Sub

    Private Sub Commande_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Commande.Click

        If Commande.Text = "Lancer le logiciel" Then
            Commande.Text = "Quitter le logiciel"
            SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED Or EXECUTION_STATE.ES_CONTINUOUS) ' écran de veille Bloqué
            Selectintrofrm.Show()
        Else
            SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS) ' écran de veille OK
            Me.Dispose()
        End If

    End Sub

End Class



Regarde le code dans la Sub commande_Click avec les 2 cas ( autoriser et bloquer l'écran de veille)

Le déclaration de la Dll a été mise en Public dans un module sans mettre le mot clé Shared !

Ce code répond à tes 3questions et fonctionne nickel !
bonne prog !


La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
Profil bloqué
21 janv. 2012 à 15:31
Pour EhJoe

Quand je lance mon programme je bloque l'écran de veille et quand je quitte je le débloque

La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.

GRENIER Alain
0
Rejoignez-nous