Hallo Ich habe gesucht, aber ich kann die Antwort nicht finden. Woher weiß ich, wann der Bildschirm aus- oder eingeschaltet wird? Nicht der SystemEvents.PowerModeChanged. Ich weiß nicht, wie die Anzeige/Bildschirm EVENTC# Wie erhalte ich die Ereignisse, wenn der Bildschirm/das Display ausgeschaltet oder eingeschaltet wird?
Vielleicht
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;
}
EDIT abrufen kann ich meine Intension erklären, so gibt es vielleicht eine bessere Lösung. Ich habe einen Dual-Bindungs-WCF-Dienst ausgeführt. Es läuft auf einem Archos (tragbarer Tablet-PC). Ich möchte, dass, wenn der Benutzer für eine Leerlaufzeit aufhörte, die Verbindung sofort geschlossen wird, und wenn der Computer aus dem Leerlauf zurückkehrt, wird er sofort wieder verbunden. Die Idee von Application Idle on Code project von Tom ist schon eine gute Idee. Je weniger Stromverbrauch, desto besser. Der Start muss so schnell wie möglich sein.
Nicht wirklich, wie wollen Sie die Ereignisse abrufen. Wie kann ich feststellen, ob das Gerät eingeschaltet oder ausgeschaltet ist? - Nach 10 Minuten dimmt mein Bildschirm. - Nach 15 Minuten geht mein Bildschirm aus. - Ich bewege die Maus, der Bildschirm geht auf ON. Wie bekomme ich diese Ereignisse? (nicht die Sitzungsereignisse) – Manu
@Manu: Lassen Sie mich diese Antwort bearbeiten, um ein Beispiel zu enthalten, wie die Ereignisse abgerufen werden .... – t0mm13b
Wow, interinin. Ich habe nicht gedacht, dass es so kompliziert ist. Ich bin kein Experte, sicherlich nicht mit der Registrierung. Also habe ich ein bisschen Angst davor, mich darauf zu beziehen. "Application Idle" ist bereits eine gute Idee. – Manu