IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Probléme code "Temps d'inactivité"


Sujet :

VB.NET

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    477
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 477
    Points : 198
    Points
    198
    Par défaut Probléme code "Temps d'inactivité"
    Bonjour à vous tous et merci d'avance pour votre aide.

    Voici un code que j'ai repris d'un tutorial, qui test le temps d'inactivité de l'utilisateur. J'ai adpaté le code, pour affiché un msgbox aprés 5 secondes d'inactivité.

    Le msgbox s'affiche normalement aprés 5 secondes d'inactivité, mais pour une raison qui m'échappe. Le msgbox s'affiche à plusieurs reprise en un instant. Comment faire pour qu'il s'affiche juste une fois.

    Timer "CCTimerMain"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        Private Sub CCTimerMain_Tick(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles CCTimerMain.Tick
                 If IsInputIdle(Val(5)) Then
     
                MsgBox("Inactif")
     
            End If
        End Sub
    MODULE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    Option Strict Off
    Option Explicit On
    Module ModMain
     
        'UPGRADE_WARNING: La structure LASTINPUTINFO peut nécessiter que des attributs de marshaling soient passés en tant qu'argument dans cette instruction Declare. Cliquez ici*: 'ms-help://MS.VSCC.v90/dv_commoner/local/redirect.htm?keyword="C429C3A5-5D47-4CD9-8F51-74A1616405DC"'
        Private Declare Function GetLastInputInfo Lib "user32.dll" (ByRef plii As LASTINPUTINFO) As Integer
        Private Declare Function GetTickCount Lib "kernel32.dll" () As Integer
     
        Private Structure LASTINPUTINFO
            Dim cbSize As Integer
            Dim dwTime As Integer
        End Structure
     
        '# Permet de savoir si l'utilisateur est considéré comme absent. L'intervalle est en secondes
        Public Function IsInputIdle(ByVal vIdleTimeout As Integer) As Boolean
            Dim LII As LASTINPUTINFO
            LII.cbSize = Len(LII)
            If GetLastInputInfo(LII) <> 0 Then
                IsInputIdle = (GetTickCount - LII.dwTime) > (1000 * vIdleTimeout)
            End If
        End Function
    End Module

    Merci.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    tu testes si c'est inactif dans un timer
    donc à chaque tick de ton timer ca vérifie si ca fait plus de 5 secondes que c'est inactif, c'est le cas donc un message, etc...

    si c'est inactif, tu peux désactiver ton timer, et le réactiver dès qu'on fait quelque chose

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    477
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 477
    Points : 198
    Points
    198
    Par défaut
    J'ai pourtant essayer mais ça ne change rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
          If IsInputIdle(Val(5)) Then
                MsgBox("Inactif")
                CCTimerMain.Stop()
            End If
    J'ai même essayer avec "enabled = false"

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Peut-être, une idée de solution du coté de l'événement OnIdle de l'Application : si on lance ou relance le timer d'inactivité sur cet événement.
    Ca marche à 99%. Le 1% correspond à des situations où l'appli a été inactive pendant presque tout l'intervalle et qu'elle soit réactivée immédiatement avant la fin (dans ce cas, l'event timer est empilé et traité avant le prochain OnIdle).

    Sinon, reste implémenter un Mouse hook et un keyboard hook

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    477
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 477
    Points : 198
    Points
    198
    Par défaut
    Excuse moi, mais concrétement je dois mettre quoi comem code pour jouer sur le OnIdle ?
    Et ce code n'est pas un Mouse hook et key hook déjà ?

    Merci à toi.

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    concrétement je dois mettre quoi comem code pour jouer sur le OnIdle ?
    Tu enregistres le TickCount courant dans le OnIdle.
    Ensuite, dans l'event timer, tu compares si la différence entre tickcount courant et celui enregistré dans le OnIdle est supérieure au temps d'inactivité.
    Et ce code n'est pas un Mouse hook et key hook déjà ?
    Oui, c'est ce que fait le GETLASTINPUTINFO pour toute activité de l'utilisateur sur le PC.
    Mais j'ai un doute tout d'un coup : veux-tu détecter l'inactivité globale du PC ou seulement de l'appli ?
    J'aurais du (me) poser la question avant ...

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    477
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 477
    Points : 198
    Points
    198
    Par défaut
    No soucis, lol. Et bien l'inactivité globale.

  8. #8
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    L'intervalle du timer n'est-il pas trop petit?
    Essaye avec 1 seconde par exemple.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    477
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 477
    Points : 198
    Points
    198
    Par défaut
    La nuit porte conseil, voilà comment j'ai résolu le probléme.

    J'ai tout simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            If IsInputIdle(Val(5)) Then
                CCTimerMain.Stop()
                MsgBox("Inactif")
            End If
    J'ai tout simplement placé le CCtimerMain.stop() avant le msgbox et ça fonctionne. Le msgbox s'affiche une seul fois.

    Encore merci pour ta précieuse aide Graffito

  10. #10
    Membre chevronné Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 689
    Points : 1 960
    Points
    1 960
    Par défaut
    Effectivement c'est un peu logique car le timer continuais en arriere plan en attendant la fermeture du msgbox.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème "LoadModule ssl_module modules/mod_ssl.so"
    Par ldcarpathes dans le forum Apache
    Réponses: 9
    Dernier message: 24/01/2008, 11h07
  2. Formulaires : problème avec les slashes et les quotes
    Par GarGamel55 dans le forum Langage
    Réponses: 1
    Dernier message: 12/10/2005, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo