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é
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);
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