2017-07-17 32 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

相關問題