L'implémentation d'un verrouillage automatique de l'écran repose sur la détection d'inactivité de l'utilisateur à l'aide du filtrage de messages Windows. Cette approche utilise une minuterie pour suivre le temps d'inactivité et réinitialise le compteur lorsque des événements clavier ou souris sont détectés.
API Windows pour le Verrouillage
La fonction LockWorkStation de l'API user32.dll est utilisée pour verrouiller l'écran. Un filtre de messages intercepte les événements utilisateur pour réinitialiser le competur d'inactivité.
[DllImport("user32.dll")]
public static extern bool VerrouillerPoste();
internal class FiltreActivite : IMessageFilter
{
public bool PreFiltrerMessage(ref Message msg)
{
const int MOUVEMENT_SOURIS = 0x0200;
const int BOUTON_SOURIS_GAUCHE = 0x0201;
const int BOUTON_SOURIS_DROIT = 0x0204;
const int BOUTON_SOURIS_MILIEU = 0x0207;
if (msg.Msg == MOUVEMENT_SOURIS || msg.Msg == BOUTON_SOURIS_GAUCHE ||
msg.Msg == BOUTON_SOURIS_DROIT || msg.Msg == BOUTON_SOURIS_MILIEU)
{
VariablesGlobales.CompteurInactivite = 0;
}
return false;
}
}
</div>Variables Globales
------------------
Une classe statique stocke le compteur d'inactivité pour le suivi global.
<div>```
public static class VariablesGlobales
{
public static int CompteurInactivite = 0;
public static int DelaiVerrouillage = 300; // Exemple en secondes
}
Une minuterie périodique vérifie le compteur d'inactivité et déclenche le verrouillage lorsque le seuil est atteint.
private Timer _timerMiseAJour;
public FenetrePrincipale()
{
_timerMiseAJour = new Timer();
_timerMiseAJour.Interval = 500;
_timerMiseAJour.Tick += SurTicMinuterie;
_timerMiseAJour.Start();
}
private void SurTicMinuterie(object source, EventArgs e)
{
if (VariablesGlobales.DelaiVerrouillage > 0)
{
VariablesGlobales.CompteurInactivite++;
int seuil = (1000 / _timerMiseAJour.Interval) * VariablesGlobales.DelaiVerrouillage;
if (VariablesGlobales.CompteurInactivite >= seuil)
{
VerrouillerPoste();
VariablesGlobales.CompteurInactivite = 0;
}
}
}
</div>Initialisation du Filtre de Messages
------------------------------------
Le filtre de messages est ajouté lors du chargement de l'application pour surveiller les événements utilisateur.
<div>```
private FiltreActivite _filtre;
private void SurChargement(object sender, EventArgs e)
{
if (VariablesGlobales.DelaiVerrouillage > 0)
{
_filtre = new FiltreActivite();
Application.AddMessageFilter(_filtre);
}
}
Le filtre de messages doit être retiré à la fermeture pour éviter les fuites de mémoire.
private void SurFermeture(object sender, FormClosingEventArgs e)
{
Application.RemoveMessageFilter(_filtre);
}
</div>