Windows中获取用户鼠标键盘闲置时间,以自动设置用户的离开状态以及处理离开状态下的自动消息回复(以QQ为例进行讲解,附源码)

目录

1、概述

2、业务流程说明

3、调用GetLastInputInfo获取用户鼠标键盘闲置的时间

4、可以调用SendInput函数人为模拟一次鼠标键盘的操作

5、最后


C++软件异常排查从入门到精通系列教程(核心精品专栏,订阅量已达8000多个,欢迎订阅,持续更新...)https://blog.youkuaiyun.com/chenlycly/article/details/125529931C/C++实战专栏(重点专栏,专栏文章已更新500多篇,订阅量已达6000多个,欢迎订阅,持续更新中...)https://blog.youkuaiyun.com/chenlycly/article/details/140824370C++ 软件开发从入门到实战(重点专栏,专栏文章已更新300多篇,欢迎订阅,持续更新中...)https://blog.youkuaiyun.com/chenlycly/category_12695902.htmlVC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.youkuaiyun.com/chenlycly/article/details/124272585C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)https://blog.youkuaiyun.com/chenlycly/article/details/131405795开源组件及数据库技术(专栏文章,持续更新中...)https://blog.youkuaiyun.com/chenlycly/category_12458859.html网络编程与网络问题分享(专栏文章,持续更新中...)https://blog.youkuaiyun.com/chenlycly/category_2276111.html

1、概述

       在IM软件中一般都有这样一个功能,当用户有段时间内(通常是几分钟,软件中可配置)不操作电脑的鼠标和键盘,软件就会自动将当前用户设置为离开状态。此时如果其他用户给当前用户发消息,当前用户会自动回复一条消息。大家常用的IM软件,比如QQ,就有这样的功能,下面的讲解将以QQ为例。

2、业务流程说明

       上述功能的业务实现流程是这样的:当软件中检测到用户有段时间内不操作当前电脑的鼠标和键盘(可能用户在忙其他的事情,有段时间不操作电脑了),就会自动将当前用户设置为离开状态,并将该状态变更发送给服务器(IM聊天相关的服务器),服务器将该用户离开状态广播给其他用户。这样其他用户就能看到该用户当前处于离开状态了:

当给该用户发消息时,该用户会自动回复一条消息(软件发现自己当前是离开状态,直接回复一条自动回复消息,该回复消息可配置可修改):

当用户后面有操作鼠标或键盘,则退出离开状态,将当前用户设置为在线状态。

       用户不操作鼠标键盘持续多长时间后设置离开状态,是可配置的,一般默认是5分钟,以QQ为例,如下所示:

        自动回复消息也是可配置的,用户可以根据自己的需要,自定义回复消息,如下所示:


       在这里,给大家重点推荐一下我的几个热门畅销专栏,欢迎订阅:(博客主页还有其他专栏,可以去查看)

专栏1:【C++软件异常与异常排查从入门到精通系列教程】该精品技术专栏的订阅量已达到10000多个,专栏中包含大量项目实战分析案例,有很强的实战参考价值,广受好评!专栏文章持续更新中,已经更新到200篇以上!欢迎订阅!)

C++软件调试与异常排查从入门到精通系列文章汇总https://blog.youkuaiyun.com/chenlycly/article/details/125529931

本专栏根据多年C++软件异常排查的项目实践,系统地总结了引发C++软件异常的常见原因以及排查C++软件异常的常用思路与方法详细讲述了C++软件的调试方法与手段详细介绍分析C++软件问题的常用分析工具,以图文并茂的方式给出具体的项目问题实战分析实例(详细讲述分析排查过程,很有实战参考价值),带领大家逐步掌握C++软件调试与异常排查的相关技术,适合基础进阶和想做技术提升的相关C++开发人员!

考察一个开发人员的水平,一是看其编码及设计能力,二是要看其软件调试能力!所以软件调试能力(排查软件异常的能力)很重要,必须重视起来!能解决一般人解决不了的问题,既能提升个人能力及价值,也能体现对团队及公司的贡献!

专栏中的文章都是通过项目实战总结出来的,包含大量项目问题实战分析案例,有很强的实战参考价值!专栏文章还在持续更新中,预计文章篇数能更新到200篇以上!

专栏2:【C/C++实战进阶】(该专栏涵盖了C++多方面的内容,是当前重点打造的专栏,订阅量已达8000多个,专栏文章已经更新到500多篇,持续更新中...)

C/C++实战进阶(专栏文章,持续更新中...)https://blog.youkuaiyun.com/chenlycly/category_11931267.html

以多年的开发实战为基础,总结并讲解一些的C/C++基础与项目实战进阶内容,以图文并茂的方式对相关知识点进行详细地展开与阐述!专栏涉及了C/C++领域多个方面的内容,包括C++基础及编程要点(模版泛型编程、STL容器及算法函数的使用等)、数据结构与算法C++11及以上新特性(开源代码中可能会用到很多新特性(比如WebRTC开源库),日常编码中也会用到部分新特性,面试时也会频繁地涉及到,学习新特性很有必要)、常用C++开源库的介绍与使用(比如SQLite、libcurl、libwebsockets、libevent、jsoncpp/RapidJson、Redis、RabbitMQ、MongoDB、MQTT、ZooKeeper、OpenCV、FFmpeg、SDL、GStreamer、Live555、ReactOS等)、代码分享(调用系统API、使用开源库)、常用编程技术(动态库、多线程、多进程、数据库及网络编程等)、软件UI编程(Win32/duilib/QT/MFC)、C++软件调试技术(引发C++软件异常的常见原因分析与总结、排查C++软件异常的手段与方法、分析C++软件异常的基础知识、使用常用软件分析工具分析C++软件问题、多个项目实战问题分析案例分享等)、设计模式(单例模式、工厂模式、观察者模式、状态模式等)、网络基础知识与网络问题分析进阶内容(实战问题分析实例分享)等。本专栏的内容都是建立在项目实践的基础上,来源于项目实战,服务于项目实战,很有实战参考价值!

专栏3:【分析C++软件问题的实用软件与高效工具实战案例集锦】

C++常用软件分析工具从入门到精通案例集锦汇总(专栏文章,持续更新中...)https://blog.youkuaiyun.com/chenlycly/article/details/131405795

在C++软件开发与维护的过程中,常用的C++软件辅助分析工具有SPY++、PE工具、Dependency Walker、GDIView、Process Explorer、Process Monitor、API Monitor、Clumsy、Windbg、IDA Pro以及内存泄漏检测工具等,本专栏详细介绍如何使用这些工具去巧妙地分析和解决日常工作中遇到的问题,很有实战参考价值!

专栏4:【VC++常用功能代码封装】

VC++常用功能开发汇总(专栏文章,持续更新中...)https://blog.youkuaiyun.com/chenlycly/article/details/124272585

将10多年C++开发实践中常用的功能,以高质量的代码展现出来。这些常用的高质量规范代码,可以直接拿到项目中使用,能有效地解决软件开发过程中遇到的问题。

专栏5:【C/C++软件开发从入门到实战】(本专栏涵盖了C++多方面的内容,是当前重点打造的专栏,专栏文章已经更新到300多篇,持续更新中!欢迎订阅!) 

C++ 软件开发从入门到精通(专栏文章,持续更新中...)https://blog.youkuaiyun.com/chenlycly/category_12695902.html

根据多年C++软件开发实践,详细地总结了C/C++软件开发相关技术实现细节,分享了大量的实战案例,很有实战参考价值。


3、调用GetLastInputInfo获取用户鼠标键盘闲置的时间

        如何获取到电脑当前登入用户不操作电脑鼠标键盘的时间呢?Windows系统给我们提供了API函数GetLastInputInfo,可以获取到当前用户最后一次操作鼠标键盘的时间(是相对电脑开机后的时间),这样我们就可以创建一个定时器,在定时器中定时去获取用户最后一次操作时间,然后拿GetTickCount返回的开机时间减去最后一次操作时间,就能获取到用户多长时间没有操作鼠标键盘了。

       当不操作鼠标键盘的时间长度超过指定的时长时,将软件中的用户状态设置为离开状态。此外,用户后来可能操作鼠标键盘了,这样定时监测到的时间就会小于指定时长,就将当前用户退出离开状态,设置为在线状态。相关代码如下所示:

LASTINPUTINFO lpi;
memset( &lpi, 0, sizeof(lpi) );
lpi.cbSize = sizeof(lpi); 
GetLastInputInfo( &lpi ); // 获取到用户最后一次操作鼠标或键盘的时间
u32 dwSec = GetTickCount() - lpi.dwTime;
if ( dwSec >= 5*60000 ) // 键盘鼠标5分钟没动作,进入离开状态
{
    // 将当前用户设置为离开状态,代码省略
}
else
{
    // 将当前用户退出离开状态,恢复为在线状态,代码省略
}

上述代码放在定时器的响应函数中执行,去定时监测用户最后一次输入时间,定时器的定时时长根据自己的需要进行设置。

       对于API函数GetLastInputInfo,是Windows 2000系统开始提供的:(API函数的最低支持版本,在MSDN上会明确给出,如下所示)

Windows 2000之前的系统,比如Windows 98是不支持的,不过没关系,Windows 2000及之前的系统老早就被淘汰了,后来的经典系统Windows XP也很少有人使用了(不排除部分机构或组织少部分机器还在用XP系统),现在大家基本都在用Windows 10及以上的系统(可能还有少部分机器用的是Win7),所以不用担心系统不支持API函数GetLastInputInfo。

4、可以调用SendInput函数人为模拟一次鼠标键盘的操作

       当软件中执行到某些业务代码时,可能要人为地模拟一次鼠标键盘的操作,以退出当前的离开状态。可以调用系统API函数SendInput去模拟一次鼠标键盘的操作,相关代码如下所示:

INPUT input;
memset(&input, 0, sizeof(INPUT));
input.type = INPUT_MOUSE;
input.mi.dwFlags = MOUSEEVENTF_MOVE;
SendInput(1, &input, sizeof(INPUT));

5、最后

       在用户不操作鼠标键盘一小段时间后,自动将用户设置为离开状态,这是IM软件中的常见功能,可以调用系统API函数GetLastInputInfo去实现。也可以在需要自动退出离开时调用系统API函数SendInput去通过代码去模拟一次用户的鼠标键盘操作。本文对上述细节做了详细的说明,给大家提供一个借鉴或参考。

评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dvlinker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值