Comment déterminer, dans le code, combien de temps la machine est verrouillée?
D'autres idées en dehors de C # sont également les bienvenues.
J'aime l'idée du service Windows (et je l'ai acceptée) pour sa simplicité et sa propreté, mais malheureusement je ne pense pas que cela fonctionnera pour moi dans ce cas particulier. Je voulais l'exécuter sur mon poste de travail au travail plutôt qu'à la maison (ou en plus de la maison, je suppose), mais c'est verrouillé assez durement grâce au DoD. C'est en partie la raison pour laquelle je roule moi-même, en fait.
Je vais l'écrire de toute façon et voir si cela fonctionne. Merci tout le monde!
Je créerais un service Windows (un type de projet Visual Studio 2005) qui gère l'événement OnSessionChange comme indiqué ci-dessous:
Ce que vous enregistrez et comment vous enregistrez l'activité à ce stade dépend de vous, mais un service Windows fournit un accès rapide et facile aux événements Windows tels que le démarrage, l'arrêt, la connexion / déconnexion, ainsi que les événements de verrouillage et de déverrouillage.
la source
La solution ci-dessous utilise l'API Win32. OnSessionLock est appelé lorsque le poste de travail est verrouillé et OnSessionUnlock est appelé lorsqu'il est déverrouillé.
la source
Je sais que c'est une vieille question, mais j'ai trouvé une méthode pour obtenir l'état de verrouillage pour une session donnée.
J'ai trouvé ma réponse ici mais c'était en C ++, donc j'ai traduit autant que possible en C # pour obtenir l'état de verrouillage.
Alors voilà:
Remarque: le code ci-dessus a été extrait d'un projet beaucoup plus important, donc si j'ai raté un peu, désolé. Je n'ai pas eu le temps de tester le code ci-dessus mais je prévois de revenir dans une semaine ou deux pour tout vérifier. Je l'ai seulement posté maintenant parce que je ne voulais pas oublier de le faire.
la source
if (session_info_ex.Level != 1)
- si la condition est vraie, la mémoire ne sera pas libérée. 2. si session_info_ex.Level! = 1 vous ne devriez pas faire ceci:Marshal.PtrToStructure<WTSINFOEX>(ppBuffer);
parce que la taille du buffer retourné peut différer de la taille de WTSINFOEXUInt32 Reserved;
place, vous devez définir la structureWTSINFOEX_LEVEL1
complètement. Dans ce cas, le compilateur effectuera un remplissage (alignement) correct des champs à l'intérieur de la structure. 4. La fonctionWTSFreeMemoryEx
est mal utilisée ici.WTSFreeMemory
doit être utilisé à la place.WTSFreeMemoryEx
est destiné à libérer de la mémoire aprèsWTSEnumerateSessionsEx
.CharSet = CharSet.Auto
doit être utilisé dans tous les attributs.Si vous êtes intéressé par l'écriture d'un service Windows pour "trouver" ces événements, topshelf (la bibliothèque / structure qui rend l'écriture des services Windows beaucoup plus facile) a un hook.
et maintenant le code pour câbler le service topshelf à l'interface / béton ci-dessus
Tout ce qui est ci-dessous est une configuration topshelf "typique" .... sauf pour 2 lignes que j'ai marquées comme
/ * CECI EST LA LIGNE MAGIQUE * /
C'est ce qui déclenche la méthode SessionChanged.
J'ai testé cela avec Windows 10 x64. J'ai verrouillé et déverrouillé ma machine et j'ai obtenu le résultat souhaité.
Mon packages.config pour fournir des conseils sur les versions:
la source
x.EnableSessionChanged();
en conjonction avec l'ServiceSessionChange
implémentation d'interface si vous avez implémentéServiceControl
et ne créez pas l'implicité d'instance de classe de service. Commex.Service<ServiceImpl>();
. Vous devez implémenterServiceSessionChange
enServiceImpl
classe:class ServiceImpl : ServiceControl, ServiceSessionChange
NOTE : Ce n'est pas une réponse, mais une (contribution) à la réponse de Timothy Carter , car ma réputation ne me permet pas de commenter jusqu'à présent.
Juste au cas où quelqu'un aurait essayé le code de la réponse de Timothy Carter et ne l'a pas fait fonctionner immédiatement dans un service Windows, il y a une propriété qui doit être définie
true
dans le constructeur du service. Ajoutez simplement la ligne dans le constructeur:Et assurez-vous de ne pas définir cette propriété après le démarrage du service, sinon un
InvalidOperationException
sera renvoyé.la source
Vous trouverez ci-dessous le code de fonctionnement à 100% pour savoir si le PC est verrouillé ou non.
Avant d'utiliser cela, utilisez l'espace de noms
System.Runtime.InteropServices
.la source