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

时间:2010-08-25 20:21:29

标签: c# webkit keypress mousemove

我正在编写一个相对简单的C#项目。想想“公共网络终端”。基本上有一个最大化的表单,上面有一个填充停靠的Web浏览器。我正在使用的Web浏览器控件是此处的WebKit控件:

WebKit Download Page

我正在尝试通过保留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;
    }

USAGE

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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