如何判断当前是否显示登录屏幕?

时间:2014-04-18 05:19:45

标签: c++ c windows winapi winlogon

我正在编写一个将使用local system凭据运行的服务应用程序。如果在任何特定时间显示Windows登录屏幕,我将需要从我的服务中了解。有没有办法做到这一点?

PS。可以通过锁定工作站来启动的屏幕:

enter image description here

或者尝试切换用户:

enter image description here

或者按Ctrl + Alt + Del:

enter image description here

PS。我需要这个在Windows XP及更高版本上运行。

编辑:到目前为止,我提出的唯一可行解决方案是查看LogonUI.exe进程是否正在运行。这种方法的问题是如何区分实际的系统登录过程和具有该映像名称的任何其他进程?

3 个答案:

答案 0 :(得分:2)

如评论中所述,您试图检测交互式桌面会话中的进程是否应显示消息框。如果交互式会话未激活,则没有必要这样做。

在这种情况下,我认为您提出的解决方案是错误的。相反,您应该通过调用WTSRegisterSessionNotification来注册会话更改通知。执行此操作后,您将收到WM_WTSSESSION_CHANGE条消息,以便您跟踪当前状态。

请注意,您在桌面应用中而不是服务中执行此操作。该服务仍将其消息发送到桌面应用程序。但桌面应用程序现在知道是否值得展示它们。

<强>更新

雷米在评论中提出了一个更好的方法:

  

如果使用单独的应用程序,则根本没有理由检测会话更改,应用程序可以简单地检查当前分配的工作站/桌面是否是当前交互式工作站/桌面,比较GetThreadDesktop()例如,OpenInputDesktop()

答案 1 :(得分:1)

所有此类屏幕都显示在单独的桌面上。您可以尝试enumerate用户的桌面并将其与当前桌面进行比较(我不确定会话0中的服务 - Vista及以上 - 可以这样做;如果不是,则在用户会话中生成帮助程序进程)。但是,如果UAC桌面启动,则可能会出现误报。另一个极端情况是无用户的情况(在任何用户上架之前启动之后)。

答案 2 :(得分:1)

窗口中有几种状态。

  1. 已注销状态
  2. 当Winlogon处于注销状态时,系统会提示用户标识自己并提供身份验证信息。如果用户提供正确的用户帐户信息并且没有任何限制阻止它,则用户登录并在应用程序桌面中执行shell程序(例如Windows资源管理器)。 Winlogon更改为登录状态。

    1. 登录状态
    2. 当Winlogon处于登录状态时,用户可以与shell交互,激活其他应用程序并完成工作。从登录状态,用户可以停止所有工作并注销,或锁定他们的工作站(保留所有工作)。如果用户决定注销,Winlogon将终止与该登录会话关联的所有进程,并且工作站将可供另一个用户使用。相反,如果用户决定锁定工作站,则Winlogon将更改为工作站锁定状态。

      1. 工作站锁定状态
      2. 当Winlogon处于工作站锁定状态时,将显示一个安全桌面,直到用户通过提供与最初登录用户相同的标识和身份验证信息解锁工作站,或者直到管理员强制注销为止。如果工作站已解锁,则会显示应用程序桌面,并且可以继续工作。

        参考:https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa380547(v=vs.85).aspx

        P.S。注册安全注意序列(SAS,CTRL + ALT +删除)包含在Workstation-Locked状态

        同样,Windows上有几种桌面类型。

        1. Winlogon桌面

        2. 应用程序桌面(=默认桌面)

        3. 屏幕保护程序桌面

        4. 安全桌面

        5. 我建议你读这个: https://msdn.microsoft.com/ko-kr/library/windows/desktop/aa375994(v=vs.85).aspx

          我不知道我的答案是你想要的......但我希望它在某些方面有所帮助。