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 ;
}
else
{
var count = Environment.TickCount - (long)vLastInputInfo.dwTime;
var icount = count / ;
return icount;
}
} }

调用:

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

出处:https://www.cnblogs.com/gaobing/p/4421400.html
========================================================================
重置空闲时间,可以在代码中模拟鼠标或键盘操作
可参考我的博文:C# 模拟鼠标移动和点击
========================================================================
在项目中出现的问题:
(1)问题一
在项目上线以后,调用GetLastInputTime出现负数的情况,刚开始也是考虑是否有数据类型不匹配而溢出的情况,由于没有详细Environment.TickCount 和 (long)vLastInputInfo.dwTime的记录,且电脑重启一次后可以正常。
也就是说,当计算数小于int.MaxValue的时候,计算都是正常的,超过这个数,则计算结果异常。
从网上寻求,看来大家也有遇到这个情况。参考如下连接,描述了Environment.TickCount的实现和出现负数的情况
文章里说了:
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
使用上面的数自己验证
C# 获取操作系统空闲时间的更多相关文章
- 系统空闲时间判断&命名验证
一.系统空闲时间判断 需要一个自动登录注销的功能,当鼠标移动和或者键盘输入的时候认为当前用户在线,否则过了设置时间就自动退出.好在前辈们留下了这样的一个类: MouseKeyBoardOperate: ...
- C# 获取操作系统相关信息
1.获取操作系统版本(PC,PDA均支持) Environment.OSVersion 2.获取应用程序当前目录(PC支持) Environment.CurrentDirectory 3.列举本地硬盘 ...
- js获取当前系统时间
Js获取当前日期时间及其它操作var myDate = new Date();myDate.getYear(); //获取当前年份(2位)myDate.getFullYear(); //获取完整的年份 ...
- 怎么使用Delphi获取当前的时间,精确到毫秒
先介绍一个可能比较常用的方法,获取当前时间 var datetime: string; begin datetime:= FormatDateTime('yyyy-mm-dd hh:mm:ss', N ...
- js 获取当前的时间
第一个小程序,用js获取当前的时间,,比较特殊的是 月是从0开始算的,显示的时候要加1,获取日用getDate(),获取周 getDay(), 直接上代码 <!DOCTYPE html> ...
- JAVA中获取当前系统时间及格式转换
JAVA中获取当前系统时间 一. 获取当前系统时间和日期并格式化输出: import java.util.Date;import java.text.SimpleDateFormat; publi ...
- 代码中,使用__DATE__宏,获取程序编译时间,如何保证每次编译代码(非重新生成方式),都能更新__DATE__的值?
代码中,使用__DATE__宏,获取程序编译时间,如何保证每次编译代码(非重新生成方式),都能更新__DATE__的值? 解决:通过vs的预先生成命令中,添加批处理命令,删除对应的obj文件方式,强制 ...
- NTDLL未文档化函数RtlGetNtVersionNumbers获取操作系统版本
作为新手,对获取操作系统版本号好奇过,因为曾经假象过一个场景:自己的程序在windows xp环境下编译,在windows 2003, windows 7,windows 8是否需要提权或者兼容处理, ...
- Oracle存储过程获取YYYY-MM-DD的时间格式
环境:Oracle 10g,11g 问题重现:PL/SQL中命令窗口下,发现存储过程得到的时间格式不符合预期要求. SQL> select sysdate from dual; SYSDATE ...
随机推荐
- socks5 代理服务器ss5配置
安装 yum install pam-devel openldap-devel openssl-devel yum -y install gcc automake make pam-devel ope ...
- Kubernetes 使用 Weave Scope 监控集群(十七)
目录 一.安装 二.使用 Scope 2.1.拓扑结构 2.2.在线操作 2.3.强大的搜索功能 创建 Kubernetes 集群并部署容器化应用只是第一步.一旦集群运行起来,我们需要确保一起正常,所 ...
- Linux内核中的双向链表struct list_head
一.双向链表list_head Linux内核驱动开发会经常用到Linux内核中经典的双向链表list_head,以及它的拓展接口和宏定义:list_add.list_add_tail.list_de ...
- Python怎么去写单元测试用例去测试hello world呢
逛着博客园,看到乙醇大佬的一篇随笔 https://www.cnblogs.com/nbkhic/p/9370446.html,于是就在想怎么测试这句hello world print('hello ...
- git 删除本地分支,删除远程分支
本地分支 git branch -d 分支名 远程分支 git push origin --delete 分支名 查看所有分支 git branch -a
- zuul网关路由作用
为了方便客户端调用微服务,所以设计出了网关.在微服务实例地址发生改变的情况下,客户端调用服务要能够不受影响. 网关可以完成的功能:路由,反向代理,日志记录,权限控制,限流 在本例子中 Eureka ...
- [转帖]8个最佳Docker容器监控工具,收藏了
8个最佳Docker容器监控工具,收藏了 https://www.sohu.com/a/341156793_100159565?spm=smpc.author.fd-d.9.1574127778732 ...
- Codeforces Round #499 (Div. 1) F. Tree
Codeforces Round #499 (Div. 1) F. Tree 题目链接 \(\rm CodeForces\):https://codeforces.com/contest/1010/p ...
- 「UER#2」信息的交换
「UER#2」信息的交换 吉利题.. 不难发现,置换中的每一个循环是独立的,每一个循环分别对应一个独立的联通块. 根据题目的性质,每一个联通块做的事情等价于其按照编号从小到大遍历的的dfs生成树做的事 ...
- Scala 系列(四)—— 数组 Array
一.定长数组 在 Scala 中,如果你需要一个长度不变的数组,可以使用 Array.但需要注意以下两点: 在 Scala 中使用 (index) 而不是 [index] 来访问数组中的元素,因为访问 ...