Ich schreibe eine App, die manchmal Benachrichtigungen an den Benutzer in Form von Toaster Nachrichten .
Wenn der Benutzer nicht anwesend ist, kann er die Benachrichtigung nicht sehen. Also, was ich tun möchte, ist in der Lage zu überprüfen, ob der Benutzer den Bildschirm gesperrt hat oder ob der Bildschirmschoner aktiviert ist.
Jede Benachrichtigung, die ausgelöst wird, während der Benutzer sie nicht sehen kann, wird verzögert und angezeigt, wenn sich der Benutzer anmeldet und seine Sitzung fortsetzt.
Ich bin selbst auf Windows 7, aber ich würde eine Lösung bevorzugen, die universell für Windows XP und höher funktioniert.
Es gibt keine dokumentierte Möglichkeit herauszufinden, ob die Arbeitsstation derzeit gesperrt ist. Sie können jedoch eine Benachrichtigung erhalten, wenn sie gesperrt wird. Wenn Sie das SystemEvents.SessionSwitch-Ereignis abonnieren, erhalten Sie SessionSwitchReason.SessionLock und Unlock.
Der Bildschirmschoner ist auch lästig. Ihr Hauptfenster erhält die WM_SYSCOMMAND-Nachricht SC SCREENSAVE, wenn der Bildschirmschoner aktiviert wird. Sie können SystemParametersInfo anpinnen, um zu überprüfen, ob es ausgeführt wird. Sie finden Beispielcode in meiner Antwort in Dieser Thread .
Es gibt keinen guten Weg herauszufinden, ob der Benutzer eingeschlafen ist.
Ich habe diesen Code kürzlich erneut von einem vorherigen Blog überprüft posten Sie um sicherzustellen, dass es auf Versionen von Windows XP bis 7, x86 und x64 funktioniert und bereinigt es ein wenig.
Hier ist der neueste minimalistische Code, der prüft, ob die Workstation gesperrt ist und ob der Bildschirmschoner in zwei einfach zu verwendenden statischen Methoden ausgeführt wird:
%Vor%UPDATE : Der Code wurde anhand von Vorschlägen in den Kommentaren aktualisiert.
Wenn die Arbeitsstation gesperrt ist, gibt die OpenInputDesktop -Methode kein Handle zurück, sodass wir auf OpenDesktop zurückgreifen können, um sicherzustellen, dass sie gesperrt ist Schalter. Wenn es nicht gesperrt ist, wird Ihr Standarddesktop nicht aktiviert, da OpenInputDesktop ein gültiges Handle für den angezeigten Desktop zurückgibt.
Verwenden Sie SystemParametersInfo , um festzustellen, ob der Bildschirmschoner ausgeführt wird - der Calltyp ist SPI_GETSCREENSAVERRUNNING. Dies wird ab Win2000 unterstützt.
Es gibt Code von @dan_g auf StackOverflow hier um zu überprüfen, ob wksta gesperrt ist.
Es gibt viele Gründe, warum der Benutzer Ihre Benachrichtigungen nicht sehen kann, z. B. für die Videowiedergabe im Vollbildmodus oder wenn der Benutzer gerade nicht anwesend ist.
Ich schlage vor, dass, anstatt zu überprüfen, ob die Benachrichtigung angezeigt werden kann, überprüfen Sie, ob der Benutzer dort ist, können Sie das tun, indem Sie die Tastatur und die Maus überwachen.
Dies zeigt an, wann die Sitzung gesperrt und entsperrt ist.