none
API:GetLastInputInfo相关问题 RRS feed

  • 问题

  • 各位专家好:

        我程序调用windows API获取鼠标键盘空闲时间(GetLastInputInfo)怎么计算的请专家解答一下。我有如下代码:

     [StructLayout(LayoutKind.Sequential)]
            private struct LASTINPUTINFO
            {
                [MarshalAs(UnmanagedType.U4)]
                public int cbSize;
                [MarshalAs(UnmanagedType.U4)]
                public uint dwTime;
            }
            /// <summary>
            /// 调用windows API获取鼠标键盘空闲时间
            /// </summary>
            /// <param name="plii"></param>
            /// <returns></returns>
            [DllImport("user32.dll")]
            private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
    
    
     private double GetIdleTick()
            {
                LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
                lastInputInfo.cbSize = Marshal.SizeOf(lastInputInfo);
                if (!GetLastInputInfo(ref lastInputInfo))
                    return 0;
    
                return Environment.TickCount - (double)lastInputInfo.dwTime;
            }
    
    
     Console.WriteLine("毫秒:  " + GetIdleTick());
     Console.WriteLine("秒:  " + GetIdleTick() / 1000);

    在vs输出中,在我自己的电脑测试,当按住shift键盘down不up,空闲时间一直累计1秒、2秒这样增长。当up时重新计时。

    秒:  0.889
    毫秒:  889
    秒:  0.889
    毫秒:  905
    秒:  0.905
    毫秒:  921
    秒:  0.921
    毫秒:  921
    秒:  0.921
    毫秒:  936
    秒:  0.936
    毫秒:  952
    秒:  0.952
    毫秒:  952
    秒:  0.952
    毫秒:  967
    秒:  0.967
    毫秒:  983
    秒:  0.983
    毫秒:  983
    秒:  0.983
    毫秒:  999
    秒:  0.999
    毫秒:  1014
    秒:  1.014
    毫秒:  1014
    秒:  1.014
    毫秒:  1030
    秒:  1.03
    毫秒:  1030
    秒:  1.03
    毫秒:  1045
    秒:  1.045
    毫秒:  1061
    秒:  1.061
    毫秒:  1061
    秒:  1.061
    毫秒:  1077
    秒:  1.077
    毫秒:  1092
    秒:  1.092
    毫秒:  1092
    秒:  1.092
    毫秒:  1108
    秒:  1.108
    毫秒:  1123
    秒:  1.123
    毫秒:  1123
    秒:  1.123
    毫秒:  1139
    秒:  1.139
    毫秒:  1155
    秒:  1.155
    毫秒:  1155
    秒:  1.155
    毫秒:  1170
    秒:  1.17
    毫秒:  1170
    秒:  1.17
    毫秒:  1186
    秒:  1.186
    毫秒:  1201
    秒:  1.201
    毫秒:  1201
    秒:  1.201
    毫秒:  1217
    秒:  1.217
    毫秒:  1233
    秒:  1.233
    毫秒:  1233
    秒:  1.233
    毫秒:  1248
    秒:  1.248
    毫秒:  1264
    秒:  1.264
    毫秒:  1264
    秒:  1.264
    毫秒:  1279
    秒:  1.279
    毫秒:  1279
    秒:  1.279
    毫秒:  1295
    秒:  1.295
    毫秒:  1311
    秒:  1.311
    毫秒:  1311
    秒:  1.311
    毫秒:  1326
    秒:  1.326
    毫秒:  1342
    秒:  1.342
    毫秒:  1342
    秒:  1.342
    毫秒:  1357
    秒:  1.357
    毫秒:  1373
    秒:  1.373
    毫秒:  1373
    秒:  1.373
    毫秒:  1389
    秒:  1.389
    毫秒:  1404
    秒:  1.404
    毫秒:  1404
    秒:  1.404
    毫秒:  1420
    秒:  1.42
    毫秒:  1420
    秒:  1.42
    毫秒:  1435
    秒:  1.435
    毫秒:  1451
    秒:  1.451
    毫秒:  1451
    秒:  1.451
    毫秒:  1467
    秒:  1.467
    毫秒:  1482
    秒:  1.482
    毫秒:  1482
    秒:  1.482
    毫秒:  1498
    秒:  1.498
    毫秒:  1513
    秒:  1.513
    毫秒:  1529
    秒:  1.529
    毫秒:  1529
    秒:  1.529
    毫秒:  1545
    秒:  1.545
    毫秒:  1545
    秒:  1.545
    毫秒:  1560
    秒:  1.56
    毫秒:  1576
    秒:  1.576
    毫秒:  1576
    秒:  1.576
    毫秒:  1591
    秒:  1.591
    毫秒:  1607
    秒:  1.607
    毫秒:  1607
    秒:  1.607
    毫秒:  1623
    秒:  1.623
    毫秒:  1638
    秒:  1.638
    毫秒:  1638
    秒:  1.638
    毫秒:  1654
    秒:  1.654
    毫秒:  1669
    秒:  1.669
    毫秒:  1669
    秒:  1.669
    毫秒:  1685
    秒:  1.685
    毫秒:  1685
    秒:  1.685
    毫秒:  1701
    秒:  1.701
    毫秒:  1716
    秒:  1.716
    毫秒:  1716
    秒:  1.716
    毫秒:  1732
    秒:  1.732
    毫秒:  1747
    秒:  1.747
    毫秒:  1747
    秒:  1.747
    毫秒:  1763
    秒:  1.763
    毫秒:  1779
    秒:  1.779
    毫秒:  1779
    秒:  1.779
    毫秒:  1794
    秒:  1.794
    毫秒:  1810
    秒:  1.81
    毫秒:  1810
    秒:  1.81
    毫秒:  1825
    秒:  1.825
    毫秒:  1825
    秒:  1.825
    毫秒:  1841
    秒:  1.841
    毫秒:  1857
    秒:  1.857
    毫秒:  1857
    秒:  1.857
    毫秒:  1872
    秒:  1.872
    毫秒:  1888
    秒:  1.888
    毫秒:  1888
    秒:  1.888
    毫秒:  1903
    秒:  1.903
    毫秒:  1919
    秒:  1.919
    毫秒:  1919
    秒:  1.919
    毫秒:  1935
    秒:  1.935
    毫秒:  1935
    秒:  1.935
    毫秒:  1950
    秒:  1.95
    毫秒:  1966
    秒:  1.966
    毫秒:  1966
    秒:  1.966
    毫秒:  1981
    秒:  1.981
    毫秒:  1997
    秒:  1.997
    毫秒:  1997
    秒:  1.997
    毫秒:  2013
    秒:  2.013
    毫秒:  2028
    秒:  2.028
    毫秒:  2028
    秒:  2.028
    毫秒:  2044
    秒:  2.044

    但是换了另外一台电脑,当按住shift键盘down不up,空闲时间一直在0.0几秒中跳动

    毫秒:  15
    秒:  0.015
    毫秒:  31
    秒:  0.031
    毫秒:  47
    秒:  0.047
    毫秒:  47
    秒:  0.047
    毫秒:  62
    秒:  0.062
    毫秒:  78
    秒:  0.078
    毫秒:  78
    秒:  0.078
    毫秒:  0
    秒:  0
    毫秒:  0
    秒:  0
    毫秒:  16
    秒:  0.016
    毫秒:  16
    秒:  0.016
    毫秒:  16
    秒:  0.016
    毫秒:  0
    秒:  0
    毫秒:  16
    秒:  0.016

    2017年12月9日 13:40

答案

  • 谢谢您的回复

    目前我的处理方式是通过一个不断循环的线程来计算鼠标空闲的时间,用当前坐标点和上一个坐标点的比较来计算时间;屏蔽了API:GetLastInputInfo 的调用。只是感觉性能方面稍微差点。但是目前也没有想到其他更好的解决方案。

    2017年12月12日 9:42

全部回复

  • Hi,

    欢迎在MSDN论坛发帖。

    如果你在另外一台电脑上面也安装上VS工具,在VS工具中调试现在的代码,会出现什么情况?这个你测试过了吗?

    我不知道是不是VS的里面的线程影响到当前的代码,才导致你看到的结果?  因为VS在debug的时候,都会attach 当前的程序中。

    从MSDN的官网中,我们可以看到这句话:

    The tick count when the last input event was received (see LASTINPUTINFO) is not guaranteed to be incremental. In some cases, the value might be less than the tick count of a prior event. For example, this can be caused by a timing gap between the raw input thread and the desktop thread or an event raised by SendInput, which supplies its own tick count.

    tick count 不会保证去一直增加,有可能是desktop 的线程或者其他 event 的触发,导致count 少于一个event 周期。

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年12月11日 3:14
    版主
  • 非常感谢您的回答;

    我自己的是笔记本电脑(win7 x64),我通过测试另外两台台式电脑(win7 x64)一台笔记本(win10),两台有安装vs,一台没有安装vs,测试的这三台电脑都是当不空闲处理。当按住shift or ctrl  or alt 这些键盘的时候,键盘down不up,空闲时间一直在0.0几秒中跳动。

    请问这个如何设置使它认为是空闲状态一直增加时间呢?我希望我按住shift or ctrl  or alt 这些键盘的时候,键盘down不up,空闲时间一直累计1秒、2秒这样增长。

    =============================================

    我现在有个需求想要获取鼠标的空闲时间。我的IDE是vs2013,wpf+c#。所以我想改变另一种实现方式:

    在网上查找各种资料都是调用API:GetLastInputInfo()这个函数,但是这个函数是是处理鼠标和键盘两个输入事件的空闲时间,但是我目前只想要鼠标是否空闲的时间,键盘操作与不操作不关心。

    请问专家有这个的API或者有处理逻辑方案吗?谢谢。

    不能用全局钩子的方式去处理,全局钩子会被360屏蔽。




    2017年12月11日 6:34
  • Hi,

    感谢你的反馈。

    从MSDN官网知道API:GetLastInputInfo 没有办法保证,空闲时间一直在增加。

    一般解决空余时间都是使用钩子,可你又不能使用构造,很难找到两全的办法,在wfp中,有人使用钩子就解决过空余的时间。 你可以参考一下。

    HOW TO track a user's idle time

    Best Regards,

    Hart

    注意:此回复包含对第三方万维网站点的引用。 Microsoft提供此信息为您提供方便。 Microsoft不控制这些网站,并且没有测试在这些网站上发现的任何软件或信息; 因此,Microsoft不能对任何软件或信息的质量,安全性或适用性做任何声明。 使用互联网上发现的任何软件都存在固有的危险,Microsoft警告您,在从互联网检索任何软件之前,请确保您完全理解风险。


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2017年12月12日 9:28
    版主
  • 谢谢您的回复

    目前我的处理方式是通过一个不断循环的线程来计算鼠标空闲的时间,用当前坐标点和上一个坐标点的比较来计算时间;屏蔽了API:GetLastInputInfo 的调用。只是感觉性能方面稍微差点。但是目前也没有想到其他更好的解决方案。

    2017年12月12日 9:42