zoukankan      html  css  js  c++  java
  • C# 获取操作系统空闲时间

    获取系统鼠标和键盘没有任何操作的空闲时间

    复制代码
         public class CheckComputerFreeState
    {
    /// <summary> /// 创建结构体用于返回捕获时间 /// </summary> [StructLayout(LayoutKind.Sequential)] struct LASTINPUTINFO { /// <summary> /// 设置结构体块容量 /// </summary> [MarshalAs(UnmanagedType.U4)] public int cbSize; /// <summary> /// 抓获的时间 /// </summary> [MarshalAs(UnmanagedType.U4)] public uint dwTime; } [DllImport("user32.dll")] private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); /// <summary> /// 获取键盘和鼠标没有操作的时间 /// </summary> /// <returns>用户上次使用系统到现在的时间间隔,单位为秒</returns> public static long GetLastInputTime() { LASTINPUTINFO vLastInputInfo = new LASTINPUTINFO(); vLastInputInfo.cbSize = Marshal.SizeOf(vLastInputInfo); if (!GetLastInputInfo(ref vLastInputInfo)) { return 0; } else { var count = Environment.TickCount - (long)vLastInputInfo.dwTime; var icount = count / 1000; return icount; } } }
    复制代码

    调用:

    复制代码
           static void Main(string[] args)
            {
                Timer t = null;
                t = new Timer((o) =>
               {
                   var result = GetLastInputTime();
                   Console.WriteLine(result);
                   if (result < 1*60) return;
                   if (t == null) return;
                   t.Dispose();
                   Console.WriteLine("电脑1分钟未操作!");
               }, null, 1000, 1000);
    
                Console.ReadLine();
            }
    复制代码

    出处:https://www.cnblogs.com/gaobing/p/4421400.html

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

    重置空闲时间,可以在代码中模拟鼠标或键盘操作

    可参考我的博文:C# 模拟鼠标移动和点击

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

    在项目中出现的问题:

    (1)问题一

    在项目上线以后,调用GetLastInputTime出现负数的情况,刚开始也是考虑是否有数据类型不匹配而溢出的情况,由于没有详细Environment.TickCount  和  (long)vLastInputInfo.dwTime的记录,且电脑重启一次后可以正常。

    也就是说,当计算数小于int.MaxValue的时候,计算都是正常的,超过这个数,则计算结果异常。

    从网上寻求,看来大家也有遇到这个情况。参考如下连接,描述了Environment.TickCount的实现和出现负数的情况

    https://social.microsoft.com/Forums/en-SG/b65614b5-9b44-4a87-bb9f-2c4ef0636a4d/gettickcount-environmenttickcount-?forum=2212

    文章里说了:

    Environment.TickCount,内部是用GetTickCount来实现的,该属性的值从系统计时器派生,并以 32 位有符号整数的形式存储。因此,如果系统连续运行,TickCount 将在约 24.9 天内从零递增至 Int32. MaxValue ,然后跳至 Int32. MinValue (这是一个负数),再在接下来的 24.9 天内递增至零。
    DWORD是无符号的,计数范围在49天左右,而 Environment.TickCount属性返回的值是有符号的,所以有一半的值用负数表示!

    解决方法:

    参考链接:
    http://www.it1352.com/30652.html

    https://stackoverflow.com/questions/4645171/environment-tickcount-is-not-enough

    文章中提到的解决方法,不外乎两种:

    1)Environment.TickCount & Int32.MaxValue 或直接使用 [DllImport("kernel32.dll") ] API 中的一个 GetTickCount() ,一个是int,一个是dword

    2)public static extern UInt64 GetTickCount64();

    使用计算的时候,首要保证参与计算的两个数的类型必须一致,不一致通过上面的方法调整过来。

    测试数据:

    int a = -1716131578;

    uint b = 2578835718;

    注意:

    我在使用Environment.TickCount & Int32.MaxValue的时候就出现了前后计算的数据类型不一致,导致结果错误,

    Environment.TickCount & Int32.MaxValue - (long)vLastInputInfo.dwTime

    运算结果是uint类型,为正数,未使用括号,先算减法,后算逻辑与。

    (Environment.TickCount & Int32.MaxValue)- (long)vLastInputInfo.dwTime

    运算结果是int类型,为负数,先与运算是正,后减法,无符号的

    Int32.MaxValue的值,第一位是0,后面的31位是1

    Int32.MaxValue的值,32位全是1

    使用上面的数自己验证

  • 相关阅读:
    WebDriver Api
    Web系统基础
    python自动化测试相关资料
    持续集成Jenkins
    Git和Github库详细使用教程
    TCP/UDP协议
    CentOS连接网络设置
    Web测试基本思路:UI测试、功能测试和兼容性测试
    初识Jenkins
    selenium +python 对table的操作
  • 原文地址:https://www.cnblogs.com/mq0036/p/11383870.html
Copyright © 2011-2022 走看看