Activités utilisateurs depuis Windows Service

clavz40 Messages postés 25 Date d'inscription mardi 3 octobre 2006 Statut Membre Dernière intervention 17 août 2012 - 16 août 2012 à 20:22
clavz40 Messages postés 25 Date d'inscription mardi 3 octobre 2006 Statut Membre Dernière intervention 17 août 2012 - 17 août 2012 à 10:34
Bonjour,

J'ai une application qui doit détecter la présence d'un utilisateur et effectuer une action (fermeture de session, ...) par exemple si ce dernier est absent pendant une période de 5min !

J'ai essayé avec :
[LIST=1]
[*]
Cursor.Position couplé avec 2 timers

[*]
[DllImport("kernel32.dll", SetLastError = true)]
static extern uint GetTickCount();
[DllImport("user32.dll", SetLastError = true)]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
[StructLayout(LayoutKind.Sequential)]
struct LASTINPUTINFO
{
public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO));
[MarshalAs(UnmanagedType.U4)]
public int cbSize;
[MarshalAs(UnmanagedType.U4)]
public uint dwTime;
}
public static bool IsInputIdle(int idleTimeoutSecond)
{
LASTINPUTINFO LInInfo=new LASTINPUTINFO();
LInInfo.cbSize = LASTINPUTINFO.SizeOf;
if (GetLastInputInfo(ref LInInfo) == true)
{
bool test = (GetTickCount() - LInInfo.dwTime) > idleTimeoutSecond;
return (GetTickCount() - LInInfo.dwTime) > idleTimeoutSecond;
}
else
return false;
}

/LIST


Mon application fonctionne très bien si je la lance dans la session de l'utilisateur mais pas en tant que service !

je sèche un peu quelqu'un a une idée ?

Merci de votre aide

2 réponses

theflayer Messages postés 125 Date d'inscription dimanche 28 février 2010 Statut Membre Dernière intervention 21 juin 2015 2
17 août 2012 à 09:58
Salut,

Pas tout compris, tu veux veux fermer la session système d'un utilisateur ?
Ta quoi comme code pour l'instant ? (moi je vois pas afficher dans ton poste)


-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas
0
clavz40 Messages postés 25 Date d'inscription mardi 3 octobre 2006 Statut Membre Dernière intervention 17 août 2012
17 août 2012 à 10:34
En effet, le code n'a pas été pris...

Pour être plus clair, j'ai un service Windows. J'aimerai que ce service détecte quand l'utilisateur n'est plus devant son ordinateur pour pouvoir après un laps de temps verrouiller sa session, ou lancer des applications gourmandes en ressources (3DS-Max)...)

Le problème est que j'ai réussi a faire cela avec le code suivant, mais uniquement si mon application est lancé dans la session de l'utilisateur. ça ne fonctionne plus dès que mon application est lancé en tant que service (via le compte système)

private void timerCurseur1_Tick(object sender, EventArgs e)
        {
            //Enregistre la position courante du curseur
            Old_Point = Cursor.Position;
        }

private void timerCurseur2_Tick(object sender, EventArgs e)
        {            
            try
            { 
//Si la position relevé précedemment est identique à l'actuelle alors le curseur ne bouge plus
                if (Old_Point == Cursor.Position)
                {
                   ....



OU

[DllImport("kernel32.dll", SetLastError = true)]
        static extern uint GetTickCount();
        [DllImport("user32.dll", SetLastError = true)]
        static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
        [StructLayout(LayoutKind.Sequential)]
        struct LASTINPUTINFO
        {
            public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO));
            [MarshalAs(UnmanagedType.U4)]
            public int cbSize;
            [MarshalAs(UnmanagedType.U4)]
            public uint dwTime;
        }
        public static bool IsInputIdle(int idleTimeoutSecond)
        {
            LASTINPUTINFO LInInfo=new LASTINPUTINFO();
            LInInfo.cbSize = LASTINPUTINFO.SizeOf;
            if (GetLastInputInfo(ref LInInfo) == true)
            {
                bool test = (GetTickCount() - LInInfo.dwTime) > idleTimeoutSecond;
                return (GetTickCount() - LInInfo.dwTime) > idleTimeoutSecond;
            }
            else
                return false;
        }


En résumé, j'aimerai pouvoir récupérer l'activité de l'utilisateur via mon service !

Merci de ton aide
0
Rejoignez-nous