当前位置: 首页 > 编程语言 > C#

服务需要检测工作站是否已锁定,并且屏幕保护程序处于活动状态分享

时间:2023-04-11 00:13:25 C#

C#学习教程:ServiceNeedstoDetectifWorkstationisLockedandScreensaverisActive机器的。具体来说,我想检查屏幕保护程序是否处于活动状态并且其会话是否已锁定。此代码将在系统级服务下运行并且没有可见的UI,因此可以排除几个选项(捕获WM消息等)。除了普通工作站外,我还希望能够在多用户登录的终端服务器上工作。由于这些要求,我想知道是否需要触及不止一个Win32API。关于从哪里开始的任何想法?最直接的方法是在每个用户的会话中运行一个小程序。此应用程序的每个实例都可以与服务的主实例进行通信。Windows非常努力地尝试分离登录会话-在服务和交互式桌面之间,以及在各个终端服务会话之间-因此除非您的应用程序在该会话中运行,否则访问有关用户会话的此类信息变得非常困难。首先棘手。作为一项服务,您可以使用事件OnSessionChange来捕获所有相关时刻。使用系统;使用System.Collections.Generic;使用System.Linq;使用系统文本;使用System.ServiceProcess;使用系统诊断;namespaceMyCode{classMyService:ServiceBase{publicMyService(){this.CanHandleSessionChangeEvent=true;}protectedoverridevoidOnSessionChange(SessionChangeDescriptionchangeDescription){switch(changeDescription.Reason){caseSessionChangeReason.SessionLogon:Debug.WriteLine(changeDescription.SessionId+"登录");休息;caseSessionChangeReason.SessionLogoff:Debug.WriteLine(changeDescription.SessionId+"注销");休息;caseSessionChangeReason.SessionLock:Debug.WriteLine(changeDescription.SessionId+"锁定");休息;caseSessionChangeReason.SessionUnlock:Debug.WriteLine(changeDescription.SessionId+"unlock");休息;}base.OnSessionChange(changeDescription);}}}我相信可以根据changeDescription.SessionId识别别用户。但目前我不知道如何......编辑:这应该是可能的返回新的WindowsIdentity(p.Handle);}}返回空值;}MSDN链接一个更简单的解决方案是使用封装了各种TSAPI的Cassia来检查用户何时空闲:以上是C#学习教程:服务需要检测工作站是否被锁定,以及屏幕保护程序是否处于活动状态。所有内容共享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——使用Cassia;foreach(ITerminalServicesSessionsessioninnewTerminalServicesManager().GetSessions()){if((session.CurrentTime-session.LastInputTime>TimeSpan.FromMinutes(10))&&(!string.IsNullOrEmpty(session.UserName))){Console.WriteLine("会话{0}(用户{1})空闲",session.SessionId,session.UserName);}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: