简短:我如何在服务中确定某个电脑当前是否不显示活动桌面(即它已被锁定或未被记录)在)?
长:我正在尝试构建一个由数据库,服务和WPF应用组成的Win 7-10解决方案。当在DB中设置标志时,服务会向用户发送自定义消息 - 无论是否登录。
如果已登录,则服务将启动应用程序,该应用程序将显示消息以及重新启动/注销选项。
这很好 - 到目前为止一切都很好。
如果屏幕被锁定或没有用户登录,问题是在锁定屏幕上显示一条消息。我可以使用" msg.exe *消息"来显示消息,但我没有&#39 ;如果用户 登录,则需要msg.exe和应用程序启动。因此,我需要能够确定从DB读取标志时哪个可执行文件是合适的。 /> 要明确:我对事件发生不感兴趣。我有兴趣阅读"当前状态"在特定的时间。
NB:有很多类似于这个问题的问题,但我还没能找到一个完全涵盖我的困境的问题。大多数都与锁定事件有关,或者在服务中没有用户/没有用户登录。
答案 0 :(得分:0)
在您的服务中致电RegisterServiceCtrlHandlerEx
,您的HandlerEx
回调会收到SERVICE_CONTROL_SESSIONCHANGE
次通知,您可以跟踪WTS_SESSION_LOCK
和WTS_SESSION_UNLOCK
个事件。
WTSQuerySessionInformation(.., WTSSessionInfoEx, ...)
可以为您提供特定会话的状态(WTSINFOEX_LEVEL1。SessionFlags)。
答案 1 :(得分:0)
我没有设法在C#中实现WTSSessionInfoEx(我只能找到C ++示例并且无法成功转换),所以我接受失败并将监视事件。
来自Michael Piendl的答案有效:https://stackoverflow.com/a/734037/5992820
谢谢迈克尔!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceProcess;
using System.Diagnostics;
namespace MyCode
{
class MyService : ServiceBase
{
public MyService()
{
this.CanHandleSessionChangeEvent = true;
}
protected override void OnSessionChange(SessionChangeDescription changeDescription)
{
switch (changeDescription.Reason)
{
case SessionChangeReason.SessionLogon:
Debug.WriteLine(changeDescription.SessionId + " logon");
break;
case SessionChangeReason.SessionLogoff:
Debug.WriteLine(changeDescription.SessionId + " logoff");
break;
case SessionChangeReason.SessionLock:
Debug.WriteLine(changeDescription.SessionId + " lock");
break;
case SessionChangeReason.SessionUnlock:
Debug.WriteLine(changeDescription.SessionId + " unlock");
break;
}
base.OnSessionChange(changeDescription);
}
}
}