如何在服务中识别PC当前是锁定还是未登录?

时间:2017-07-17 12:32:53

标签: c# .net windows windows-services

简短:我如何在服务中确定某个电脑当前是否显示活动桌面(即它已被锁定或未被记录)在)?

长:我正在尝试构建一个由数据库,服务和WPF应用组成的Win 7-10解决方案。当在DB中设置标志时,服务会向用户发送自定义消息 - 无论是否登录。
如果已登录,则服务将启动应用程序,该应用程序将显示消息以及重新启动/注销选项。 这很好 - 到目前为止一切都很好。

如果屏幕被锁定或没有用户登录,问题是在锁定屏幕上显示一条消息。我可以使用" msg.exe *消息"来显示消息,但我没有&#39 ;如果用户 登录,则需要msg.exe和应用程序启动。因此,我需要能够确定从DB读取标志时哪个可执行文件是合适的。 /> 要明确:我对事件发生不感兴趣。我有兴趣阅读"当前状态"在特定的时间。

NB:有很多类似于这个问题的问题,但我还没能找到一个完全涵盖我的困境的问题。大多数都与锁定事件有关,或者在服务中没有用户/没有用户登录。

2 个答案:

答案 0 :(得分:0)

在您的服务中致电RegisterServiceCtrlHandlerEx,您的HandlerEx回调会收到SERVICE_CONTROL_SESSIONCHANGE次通知,您可以跟踪WTS_SESSION_LOCKWTS_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);
        }
    }
}