2010-08-25 34 views
2

J'écris un projet C# relativement simple. Pensez "Terminal Web public". Essentiellement, il y a un formulaire maximisé avec un navigateur web rempli-rempli dessus. Le contrôle du navigateur Web J'utilise est le contrôle WebKit trouvé ici:.NET - Détection du mouvement de la souris à travers le contrôle obstiné

WebKit Download Page

Je suis en train de détecter le système le temps d'inactivité en gardant un DateTime qui représente la dernière fois un mouvement de souris ou appuyer sur la touche a été faite.

J'ai mis en place des gestionnaires d'événements (voir le code ci-dessous), et j'ai rencontré une pierre d'achoppement. Les événements souris (et clé) ne semblent pas se déclencher lorsque ma souris passe sur le document Web. Cela fonctionne bien lorsque ma souris touche la barre de défilement verticale du contrôle du navigateur Web, donc je sais que le code est OK - il semble être une sorte de "oubli" (faute d'un meilleur mot) sur la partie du contrôle. Je pense que ma question est la suivante: à vous tous, les codeurs, comment vous y prenez-vous?

this.webKitBrowser1.KeyPress += new KeyPressEventHandler(handleKeyPress); 
this.webKitBrowser1.MouseMove += new MouseEventHandler(handleAction); 
this.webKitBrowser1.MouseClick += new MouseEventHandler(handleAction); 
this.webKitBrowser1.MouseDown += new MouseEventHandler(handleAction); 
this.webKitBrowser1.MouseUp += new MouseEventHandler(handleAction); 
this.webKitBrowser1.MouseDoubleClick += new MouseEventHandler(handleAction); 

void handleKeyPress(object sender, KeyPressEventArgs e) 
{ 
    this.handleAction(sender, null); 
} 

void handleAction(object sender, MouseEventArgs e) 
{ 
    this.lastAction = DateTime.Now; 
    this.label4.Text = this.lastAction.ToLongTimeString(); 
} 

MISE À JOUR

En utilisant la solution retenue de Joe, je mets ensemble la classe suivante. Merci à tous ceux qui ont participé.

class classIdleTime 
{ 
    [DllImport("user32.dll")] 
    static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); 

    internal struct LASTINPUTINFO 
    { 
     public Int32 cbSize; 
     public Int32 dwTime; 
    } 

    public int getIdleTime() 
    { 
     int systemUptime = Environment.TickCount; 
     int LastInputTicks = 0; 
     int IdleTicks = 0; 

     LASTINPUTINFO LastInputInfo = new LASTINPUTINFO(); 
     LastInputInfo.cbSize = (Int32)Marshal.SizeOf(LastInputInfo); 
     LastInputInfo.dwTime = 0; 

     if (GetLastInputInfo(ref LastInputInfo)) 
     { 
      LastInputTicks = (int)LastInputInfo.dwTime; 
      IdleTicks = systemUptime - LastInputTicks; 
     } 
     Int32 seconds = IdleTicks/1000; 
     return seconds; 
    } 

USAGES

idleTimeObject = new classIdleTime(); 
Int32 seconds = idleTimeObject.getIdleTime(); 
this.isIdle = (seconds > secondsBeforeIdle); 

Répondre

3

Vous pouvez simplement demander à Windows si l'utilisateur est inactif. Vous devrez utiliser P/Invoke, mais ce serait le plus facile. Découvrez la fonction GetLastInputInfo.

+0

Mis en œuvre et fonctionne comme un rêve. J'ai ajouté le code pour la classe que j'ai mis ensemble dans le message original. – Dutchie432

2

Cela ressemble à une application WinForms - pourquoi pas add an IMessageFilter? Vous verrez tous les messages Windows qui passent par la boucle d'événements, qu'ils soient ciblés sur le navigateur ou ailleurs.

+0

Excellente suggestion, mais parce que ce sera un terminal public, la performance est la clé. Sur la page à laquelle vous m'avez lié, il y avait une mise en garde indiquant que «l'ajout de filtres de message à la pompe de message pour une application peut dégrader les performances», j'ai donc décidé de ne pas y répondre à long terme. Upvote pour le bon conseil et l'effort. – Dutchie432

+0

@ Dutchie432 Il est certain que l'ajout de code à une application peut dégrader les performances. L'effet de l'ajout d'un filtre de message et de la vérification des messages de la souris est le même que la gestion des événements de la souris. Comme toujours avec des considérations de performances, prenez des mesures de profil avant de décider. –

+0

Mis à part la prudence à votre lien, la solution acceptée semblait plus facile que de réinventer la roue. Il n'a fallu que quelques lignes de code et c'était fini. Je voudrais absolument essayer votre solution si j'avais besoin de faire quelque chose qui n'a pas déjà été pris en considération ailleurs. Merci encore. – Dutchie432