c# Comment obtenir les événements lorsque l'écran/affichage passe à l'appareil HORS tension ou SUR?

Salut j'ai fait une recherche mais je ne trouve pas la réponse. Comment puis-je savoir lorsque l'écran est activé ou sur. Pas le SystemEvents.PowerModeChanged .
Je ne sais pas comment faire pour récupérer l'affichage de l'écran des ÉVÉNEMENTS

 private const int WM_POWERBROADCAST     = 0x0218;
private const int WM_SYSCOMMAND         = 0x0112;
private const int SC_SCREENSAVE         = 0xF140;
private const int SC_CLOSE              = 0xF060; //dont know
private const int SC_MONITORPOWER       = 0xF170;
private const int SC_MAXIMIZE           = 0xF030; //dont know
private const int MONITORON = -1;
private const int MONITOROFF = 2;
private const int MONITORSTANBY = 1; 
[DllImport("user32.dll")]
//static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
private static extern int SendMessage(IntPtr hWnd, int hMsg, int wParam, int lParam);
public void Init(Visual visual)
{
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
HwndSource source = ((HwndSource)PresentationSource.FromVisual(visual));
source.AddHook(MessageProc);
Handle = source.Handle;
}
public void SwitchMonitorOff()
{ //works
SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOROFF);
}
public  void SwitchMonitorOn()
{//works
SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, MONITORON);
}
public  void SwitchMonitorStandBy()
{//works
SendMessage(Handle, WM_SYSCOMMAND, SC_MONITORPOWER, MONITORSTANBY);
}
private IntPtr MessageProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
if (msg == WM_SYSCOMMAND) //Intercept System Command
{
//not finished yet
//notice the 0xFFF0 mask, it's because the system can use the 4 low order bits of the wParam 
//value as stated in the MSDN library article about WM_SYSCOMMAND.
int intValue = wParam.ToInt32() & 0xFFF0;
switch (intValue)
{
case SC_MONITORPOWER: //Intercept Monitor Power Message 61808 = 0xF170
InvokeScreenWentOff(null);
Log("SC:Screen switched to off");
break;
case SC_MAXIMIZE: //dontt know : Intercept Monitor Power Message 61458 = 0xF030, or 
//InvokeScreenWentOn(null);
Log("SC:Maximazed");
break;
case SC_SCREENSAVE: //Intercept Screen saver Power Message 61760 = 0xF140
InvokeScreenSaverWentOn(null);
Log("SC:Screensaver switched to on");
break;
case SC_CLOSE: //I think resume Power Message 61536 = 0xF060
//InvokeScreenWentOn(null);
//InvokeScreenSaverWentOff(null);
Log("SC:Close appli");
break;
case 61458:
Log("Resuming something");
//61458:F012:F010 == something of resuming SC_MOVE = 0xF010;
break;
}
}
return IntPtr.Zero;
}  

MODIFIER

Peut-être que je peux expliquer mon intension, donc il y a peut-être une meilleure solution. J'ai une Double liaison de service WCF en cours d'exécution sur. Il est en cours d'exécution sur un archos (portable, tablette pc). Je veux que lorsque l'utilisateur a arrêté de travailler pour un temps d'inactivité, la connexion se ferme tout de suite, et lorsque l'ordinateur est de retour à partir du ralenti, il se reconnecte tout de suite. L'idée de Demande d'Inactivité sur le Code du projet de Tom est déjà une bonne idée. La consommation d'énergie en moins , le mieux. Le démarrage doit être aussi rapide que possible.

OriginalL'auteur Manu | 2010-02-05