1. 程式人生 > >C# 通過服務啟動窗體(把窗體新增到服務裡)實現使用者互動的windows服務

C# 通過服務啟動窗體(把窗體新增到服務裡)實現使用者互動的windows服務

      由於個人需要,想找一個鍵盤記錄的程式,從網上下載了很多,多數都是需要註冊的,另外也多被殺軟查殺。於是決定自己寫一個,如果作為一個windows應用程式,可以實現抓取鍵盤的記錄。想要實現隨系統啟動的話,其中一種方法就是要作為windows服務,把程式碼直接寫到服務裡邊並不能抓取到鍵盤的記錄,從網上翻閱資料及檢視msdn才知道:

Windows 服務應用程式在不同於登入使用者的互動區域的視窗區域中執行。視窗區域是包含剪貼簿、一組全域性原子和一組桌面物件的安全物件。由於 Windows 服務的區域不是互動區域,因此 Windows 服務應用程式中引發的對話方塊將是不可見的,並且可能導致程式停止響應。同樣,錯誤資訊應記錄在 Windows 事件日誌中,而不是在使用者介面中引發。

服務程式一般使用的是LocalSystem帳戶,擁有自己的window station,和Default桌面,這個window station是不能於使用者互動的,也就是說,你不能在上面顯示視窗,它也不接受使用者的滑鼠、鍵盤等輸入。

      我們使用使用者帳戶登入以後,看到的桌面,是WinSta0(window station)下的Default(desktop).
WinSta0下有3個桌面:
WinLogon :以Logon對話方塊的形式出現.當用戶登入以後,WinLogon.exe切換到Default desktop.
Default :這是Explorer.exe和所有使用者程式窗口出現的地方,也就是我們通常使用windows看見的地方.應用程式就執行在這個桌面上
Screen saver :系統空閒的時候,執行屏保的桌面.

      當你在“計算機管理”中選擇一個服務,修改屬性,選擇“登入”標籤頁的“允許服務與桌面互動”,那麼該服務就使用的是WinSta0(window station)下的Default(desktop). 你也就可以與你的服務進行互動操作了。這時,你能獲取default的桌面點陣圖,因為執行緒的桌面就是WinSta0下的Default。要想同時獲得Winlogon桌面點陣圖,應該先把執行緒的桌面設定成Winlogon。

此部分程式碼公佈如下: