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
Vous devez vous connecter pour publier un commentaire.
Ont un coup d'oeil à ce blog ici qui vous aidera à réaliser ce que vous essayez d'atteindre. En outre vous avez besoin de faire un événement personnalisé de le faire pour vous quelque chose comme ceci:
Edit: Comme Manu n'était pas sûr de la façon de récupérer les événements, cette édition comprendra un exemple de code sur comment utiliser cette classe, comme indiqué ci-dessous.
Après avoir regardé ce code, et se rendre compte que quelque chose n'allait pas, il m'est apparu que Manu était à la recherche d'un moyen d'interroger le système pour détecter le Moniteur d'état de l'alimentation qui n'est pas disponible, mais, le code indique que la programmation, le moniteur peut être allumé/éteint/veille, dans le même temps, le déclenchement de l'événement, mais il voulait qu'elle soit en mesure de crochet dans le
WndProc
d'un formulaire et de traiter le message indiquant l'état de la Surveiller...maintenant, à ce stade, je vais exprimer mon opinion sur ce point.Je ne suis pas sûr à 100% si cela peut être fait ou est-ce que Windows fait d'envoyer un message de diffusion en disant quelque chose comme " Hé! Le moniteur est d'aller dormir " ou " Hey! Le moniteur est mise sous tension', j'ai peur de dire, que les Moniteurs ne pas envoyer certains logiciels de signal de Windows pour informer c'est d'aller dormir/off/on. Maintenant si quelqu'un a des suggestions, des conseils, des indices à ce sujet, n'hésitez pas à poster votre commentaire...
Energy Star logiciel dans le cadre de l'onglet écran de veille que l'on trouve lorsque vous faites un clic droit sur le bureau, n'importe où, un menu pop-up apparaît, cliquez à gauche sur "Propriétés", un "Affichage de la boîte de dialogue s'affiche, avec les différentes pages d'onglet de gauche, cliquez sur "Économiseur d'écran", Cliquez sur le bouton "Alimentation du Moniteur" groupement de la boîte, la partie de la boîte de dialogue, en quelque sorte déclenche le sous-système Windows (carte graphique?/Energy Star pilote?) pour envoyer un signal matériel pour passer sur les économies d'énergie, la fonctionnalité de l'écran lui-même...(les Moniteurs sont neufs, n'ont pas cette activé par défaut, autant que je sache...hésitez pas à faire disparaître cette notion...)
Moins qu'il y a un sans-papiers de l'API quelque part embarqués et enfouis dans les profondeurs de l'Énergie-Puissance pilote logiciel (une API est certainement en effet déclenché comment, en cliquant sur le bouton envoyer ce signal à l'écran dans lequel le mode d'Alimentation, en effet, activés par la suite!) alors, peut-être, par l'exécution d'un thread en arrière-plan de ce formulaire de demande, les bureaux de vote pour interroger encore inconnu de fonctionnalités, ou une API pour vérifier l'état de l'alimentation: il doit y avoir quelque chose là-bas que seul Microsoft sait...après tout, Energy Star, Microsoft a montré comment déclencher le mode d'économie d'énergie sur le Moniteur lui-même, ce n'est sûrement pas une rue à sens unique? ou est-il?
Désolé Manu, si je ne pouvais pas aider les autres .... 🙁
Edit #2: j'ai pensé à ce que j'ai écrit plus tôt dans l'édition et fait un peu de creuser autour d'enracinement pour une réponse et je crois que j'ai la réponse, mais d'abord, une pensée surgit dans ma tête, voir ce document ici - un document pdf à partir d' 'terranovum.com', l'indice (ou alors j'ai pensé...) était dans le registre, en utilisant les deux dernières clés de registre sur la dernière page de ce document contient l'offset spécifié dans le nombre de secondes, et en conjonction avec ce CodeProject l'article, à savoir le temps d'inactivité, il serait facile de déterminer quand le moniteur passe en mode d'attente, les sons simples ou alors j'ai pensé, Manu ne voudrais pas que l'idée soit....
Complément d'enquête avec google m'amènent à cette conclusion, la réponse se trouve dans le prolongement de la VESA BIOS spécification DPMS (Display Power Management de Signalisation), maintenant la question que se posent de ce, est de savoir comment vous interroger que la signalisation sur le VESA bios, maintenant, beaucoup de cartes graphiques modernes ont que VESA Bios monté en elle, donc il doit y avoir un port matériel quelque part où vous pouvez lire les valeurs des pins, à l'aide de cette route exigerait l'utilisation de InpOut32 ou si vous avez 64 bits de Windows, il y a un InpOut64 via pinvoke. Fondamentalement, si vous pouvez rappeler à l'aide de Turbo C ou Turbo Pascal (à la fois sur 16 bits pour le DOS), il y a une routine appelée port d'entrée/port ou similaire à lire le port matériel, ou même GWBASIC à l'aide de peek/poke. Si l'adresse du port matériel peut être trouvé, alors les valeurs peuvent être interrogés afin de déterminer si le Moniteur est en mode veille/éteint/suspendu/sur par vérification de la Synchronisation Horizontale et Verticale de la Synchronisation, je pense que c'est le plus fiable solution...
Excuses pour cette longue réponse, mais j'ai senti que je devais écrire mes pensées....
Il y a encore de l'espoir, il y a Manu 🙂 😉
Permettez-moi de modifier cette réponse à inclure un exemple de la façon de récupérer les événements....
Wow, interestin. Je n'ai pas pensé que C'est gonne être si compliqué. Je ne suis pas un expert, sûrement pas avec le registre. Je suis donc un peu peur de toucher à ça. L'Application "Inactif" est déjà une bonne idée.
Ouais, de jouer avec la vidéo d'entrée/sortie des adresses si elle est utilisée de manière incorrecte peut souffler de l'ensemble de contrôleur de...disons, en établissant la ligne de balayage invalide et l'exécution d'une vidéo d'actualisation de cette façon directe peut causer de la fumée sortir du contrôleur dans le moniteur, avez entendu parler de ce produit par hasard...
une autre chose, le h sync et v sync sont lus à partir des broches (si c'est 9 broches, 4, 5, respectivement), si c'est 15 broches 13 et 14 respectivement, en plus d'interrompre 0x10 est utilisé pour accéder à l'VESA Bios...désolé si la réponse n'est pas assez pour vous de digérer...
OriginalL'auteur t0mm13b
La partie manquante est que je n'ai pas à vous inscrire pour la suite des événements.
Trouve qu'il y a une gestion de l'alimentation exemple de Microsoft:
http://www.microsoft.com/en-us/download/details.aspx?id=4234
OriginalL'auteur Emmanuel
Cela fonctionne pour moi, même MainWindow est caché. Le code est basé sur le post ci-dessus, et le code C++ de https://www.codeproject.com/Articles/1193099/Determining-the-Monitors-On-Off-sleep-Status.
Et des méthodes Indigènes ici:
OriginalL'auteur PetrCZ
OriginalL'auteur targitaj