首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有64位等同于GetLastInputInfo / LASTINPUTINFO?

是否有64位等同于GetLastInputInfo / LASTINPUTINFO?
EN

Stack Overflow用户
提问于 2018-09-27 14:50:01
回答 2查看 794关注 0票数 3

我们使用GetLastInputInfo并计算与GetTickCount64结果的差值来确定空闲。但是,GetLastInputInfo返回的节拍计数被写入到LASTINPUTINFO的成员dwTime中,该成员是一个DWORD型,因此是一个无符号32位整数,最大值为及其最大值4294967295,相当于~49天。在正常运行时间超过这个值的机器上,这当然会导致函数报告不正确的值。

显然没有名为GetLastInputInfo64的函数,但可能有一个不同名称的函数?

EN

回答 2

Stack Overflow用户

发布于 2019-04-23 22:28:51

我们使用了一种变通方法。

只使用GetLastInputInfo()的结果来检测dwTick是否发生了变化,而不关心它发生了多大变化。

定期执行此操作。

当滴答发生变化时(数值与之前的读数不同),启动您自己的计时器,并使用该计时器来检测输入是否空闲了30秒。

使用这种方法,您将永远不需要处理环绕。

票数 3
EN

Stack Overflow用户

发布于 2021-02-13 21:15:11

@Anders:

代码语言:javascript
运行
复制
public class IdleDetection
{
    private struct LASTINPUTINFO
    {
        public uint cbSize;
        public uint dwTime;
    }

    [DllImport("user32.dll")]
    private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);

    private readonly Timer _idleTimer;
    private double _idleSeconds = 0;
    private uint _previousLastInput = 0;
    private DateTime _idleStart = DateTime.Now;
    private object _lock = new object();

    public IdleDetection()
    {
        _idleTimer = new Timer(TimerCallback, null, 1000, Timeout.Infinite);
    }

    public TimeSpan IdleTime
    {
        get {
            lock (_lock)
            {
                return TimeSpan.FromSeconds(_idleSeconds);
            }
        }
    }

    private void TimerCallback(object state)
    {
        lock (_lock)
        {
            var lastInput = GetLastInputInfoValue();

            if (lastInput == _previousLastInput)
            {
                _idleSeconds = (DateTime.Now - _idleStart).TotalSeconds;
            }
            else
            {
                _idleSeconds = 0;
                _idleStart = DateTime.Now;
            }

            _previousLastInput = lastInput;
        }
        _idleTimer.Change(1000, Timeout.Infinite);
    }

    private static uint GetLastInputInfoValue()
    {
        LASTINPUTINFO lastInPut = new LASTINPUTINFO();
        lastInPut.cbSize = (uint)Marshal.SizeOf(lastInPut);
        GetLastInputInfo(ref lastInPut);
        return lastInPut.dwTime;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52531072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档