【问题标题】:.NET - Detecting mouse movement through stubborn control.NET - 通过顽固的控制检测鼠标移动
【发布时间】:2010-08-25 20:21:28
【问题描述】:

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

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

更新

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

用法

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

【问题讨论】:

    标签: c# webkit keypress mousemove


    【解决方案1】:

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

    【讨论】:

    • 像梦想一样实施和工作。我在原始帖子中添加了我放在一起的课程的代码。
    【解决方案2】:

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

    【讨论】:

    • 很好的建议,但是因为这将是一个公共终端,所以性能是关键。在您链接到我的页面上,有一条警告说明“将消息过滤器添加到应用程序的消息泵会降低性能。”,所以我决定从长远来看反对它。为伟大的建议和努力点赞。
    • @Dutchie432 向应用程序添加任何代码肯定会降低性能。添加消息过滤器并在那里检查鼠标消息的效果与处理鼠标事件相同。一如既往地考虑性能,在决定之前进行配置文件测量。
    • 除了链接中的警告之外,公认的解决方案似乎比重新发明轮子更容易。只用了几行代码就完成了。如果我需要做一些其他地方还没有考虑到的事情,我绝对会尝试你的解决方案。再次感谢。
    • 我同意GetLastInputInfo 很好,因为它几乎不需要代码就可以解决您的问题。我只是对 MSDN 的性能评论不满意——它带有货物崇拜编程的味道。
    • 我明白你的意思。我只是觉得如果有这种谨慎,他们之前一定遇到过问题,并说“与其修复它,或者教育开发人员如何正确实施它,以及什么会导致降级,我们只会抛出一个警告”。
    猜你喜欢
    • 1970-01-01
    • 2022-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    相关资源
    最近更新 更多