2017-07-17 29 views
1

Short:如何在服务中识别当前是否显示而不是显示活动桌面(即已锁定还是未登录)?如何识别电脑当前是否已锁定或未登录?

长:我试图构建一个由数据库,服务和WPF应用程序组成的Win 7-10解决方案。在DB中设置标志时,服务会向用户发送自定义消息 - 无论是否已登录。
如果有人登录,服务将启动应用程序,该应用程序显示消息以及重新启动/日志关闭选项。 这工作正常 - 迄今如此好。

如果屏幕锁定或没有用户登录,则问题是在锁定屏幕上显示一条消息。我可以使用“msg.exe *消息”显示消息,但我不希望这两个消息。 exe和应用程序启动,如果用户登录。因此,我需要能够确定哪个可执行文件是适当的,当标志从DB读取。
要清楚:我对事件解雇不感兴趣。我有兴趣在特定的时间阅读“当前状态”。

注意:已经有很多类似于这个问题的问题,但我一直没能找到一个完全覆盖我的困境。大部分都与锁定事件有关,或者不能在服务中工作/没有用户登录。

+0

我曾经有过一些工作,我不得不从服务启动桌面上的应用程序。为此,我必须在系统托盘中创建一个图标才能获得对桌面的权限。也许如果你设置了一个系统尝试图标应用程序在启动时运行,你可以与它沟通,以确定是否有人登录它(我认为这是一个单一登录情况)。 – juharr

+0

这是一个单一的迹象,是的。我大概可以确定是否有人以这种方式签名,但它不会告诉我他们是否被锁定。作为可能的部分解决方案,我会牢记它,但我真的不希望在服务之上添加一个始终运行的应用程序。我希望尽可能保持简单,因为稳定性和占地面积小是关键。它将在10-30k电脑上运行,并将为用户提供关键信息。 – Nathan

+0

如果控制台会话在锁定时显示为“断开连接”,则可以枚举所有终端服务会话并检查它们是否都处于断开连接状态。我不知道它是否确实如此。 –

回答

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); 
     } 
    } 
} 
0

呼叫RegisterServiceCtrlHandlerEx在您服务,您HandlerEx回调然后将收到SERVICE_CONTROL_SESSIONCHANGE通知,并可以跟踪WTS_SESSION_LOCKWTS_SESSION_UNLOCK事件。

WTSQuerySessionInformation(.., WTSSessionInfoEx, ...)可以为您提供特定会话的状态(WTSINFOEX_LEVEL1。SessionFlags)。

+0

正如我在OP中提到的,我宁愿不看事件,只看当前状态。 我会研究WTSQuerySessionInformation,并回复给你,虽然听起来很有希望:) – Nathan

+0

事件是专为在服务中使用而设计的,并且易于实现,所以我不明白为什么你不能使用它。 – Anders

+0

我可以得到WTSQuerySessionInformation工作正常,但它没有给我什么我需要没有WTSSessionInfoEx - 这是更麻烦。我只能在C++中找到我没有经验的例子。我发现有人试图将其转换为C#的帖子:https://stackoverflow.com/a/36596656/5992820 ...但我无法让他的代码工作。我不是一个非常强大的程序员,所以我可能在这里头痛不已。 我可能不得不重新使用这些事件。 – Nathan

相关问题