2010-08-25 70 views
2

我在写一个相对简单的C#项目。认为“公共Web终端”。从本质上来说,它有一个最大化的形式,其上有一个填充停靠的Web浏览器。我使用的Web浏览器控件是WebKit的控制在这里找到:.NET - 通过顽固控制检测鼠标移动

WebKit Download Page

我试图通过保持它代表鼠标移动或按键被做了最后一次的DateTime检测系统空闲时间。

我已经设立了事件处理程序(见下面的代码),并遇到了一个绊脚石。当鼠标移动到Web文档上时,鼠标(和键)事件似乎不会触发。当我的鼠标触及Web浏览器控件的垂直滚动条部分时,它确实工作正常,所以我知道代码是可以的 - 这似乎是控件的某种“疏漏”(缺少更好的单词)。

我想我的问题是 - 对你们所有的编码者,你将如何去处理这个问题?

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(); 
} 

UPDATE

使用乔接受的解决方案,我总结了以下类。感谢所有参与了的人。

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; 
    } 

用法

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

回答

3

如果用户空闲,您可以问Windows。你将不得不使用P/Invoke,但它会是最简单的。查看GetLastInputInfo功能。

+0

实现并像梦一样工作。我在原文中添加了我放在一起的类的代码。 – Dutchie432 2010-08-26 12:55:05

2

这看起来像一个WinForms应用程序 - 为什么不add an IMessageFilter?您将看到每个通过事件循环传递的Windows消息,无论它是针对浏览器还是其他地方。

+0

伟大的建议,但因为这将是一个公共终端,性能是关键。在您与我联系的页面上,有一个警告:“向应用程序的消息泵添加消息过滤器可能会降低性能”,所以我长期决定反对它。 Upvote为伟大的建议和努力。 – Dutchie432 2010-08-26 12:54:31

+0

@ Dutchie432当然,向应用程序添加任何代码都会降低性能。添加消息过滤器和检查鼠标消息的效果与处理鼠标事件相同。与性能考虑一样,在决定之前进行配置文件测量。 – 2010-08-26 14:10:37

+0

除了在你的链接上的谨慎,接受的解决方案似乎比重新发明轮子更容易。它只需要几行代码就完成了。如果我需要做某些尚未考虑到其他地方的事情,我绝对会尝试您的解决方案。再次感谢。 – Dutchie432 2010-08-26 16:37:02