C# .NET-通过顽固控制检测鼠标移动

C# .NET-通过顽固控制检测鼠标移动,c#,webkit,keypress,mousemove,C#,Webkit,Keypress,Mousemove,我正在写一个相对简单的C项目。想想公共网络终端。本质上,有一个最大化的表单,上面有一个fill停靠的web浏览器。我使用的web浏览器控件是在以下位置找到的WebKit控件: 我试图通过保留DateTime来检测系统空闲时间,DateTime表示最后一次移动鼠标或按键的时间 我已经建立了事件处理程序(参见下面的代码),并且遇到了一个障碍。当我的鼠标移动到web文档上时,鼠标和按键事件似乎不会触发。当我的鼠标触到web浏览器控件的垂直滚动条部分时,它确实工作得很好,所以我知道代码还可以——这似乎是

我正在写一个相对简单的C项目。想想公共网络终端。本质上,有一个最大化的表单,上面有一个fill停靠的web浏览器。我使用的web浏览器控件是在以下位置找到的WebKit控件:

我试图通过保留DateTime来检测系统空闲时间,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();
}
更新

使用Joe接受的解决方案,我组织了以下课程。感谢所有参与的人

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


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

您可以询问Windows用户是否空闲。您必须使用P/Invoke,但这是最简单的。查看功能。

很好的建议,但因为这是一个公共终端,性能是关键。在您链接到我的页面上,有一条警告指出,为应用程序的消息泵添加消息过滤器会降低性能。因此,从长远来看,我决定不这样做。对于这一伟大的建议和努力,请向上投票。@432向应用程序添加任何代码都会降低性能。添加消息过滤器并在其中检查鼠标消息的效果与处理鼠标事件的效果相同。与性能考虑一样,在做出决定之前,要进行概要测量。除了在链接中的谨慎之外,公认的解决方案似乎比重新发明轮子更容易。只需要几行代码就完成了。如果我需要做一些其他地方没有考虑到的事情,我绝对会尝试你的解决方案。再次感谢。我同意GetLastInputInfo很好,因为它几乎不需要代码就能解决您的问题。我只是对MSDN的性能评论不满意——这有点像货物崇拜编程。我明白你的意思。我只是觉得如果有警告的话,他们以前肯定遇到过问题,他们说,与其修复它,或者教育开发人员如何正确地实现它,以及什么会导致性能下降,不如发出警告。实现并像做梦一样工作。我在原始帖子中添加了类的代码。
idleTimeObject = new classIdleTime();
Int32 seconds = idleTimeObject.getIdleTime();
this.isIdle = (seconds > secondsBeforeIdle);