2010-07-01 62 views
4

我有一個C++ Win32應用程序被編寫爲一個Windows GUI項目,現在我試圖找出它成爲一個服務/ GUI混合。我知道一個Windows服務不能/不應該有一個用戶界面。但請允許我解釋我到目前爲止以及我所拍攝的內容。Windows服務與GUI監視器?

我現在有什麼是一個Windows應用程序。運行時,它會在系統托盤中放置一個圖標,您可以雙擊打開該圖標。此應用程序的目的是處理夜間計劃中指定目錄中的文件。 GUI包含以下內容:

  • 用於手動啓動非預定掃描/處理的按鈕。
  • 用於打開修改設置的對話框的按鈕。
  • 列表框用於顯示處理線程發送的狀態消息。
  • 用於顯示圖像數據的自定義繪製窗口(文件處理包括圖像的創建和保存)。
  • 狀態欄 - 當進程沒有運行時,它顯示下一個計劃掃描的倒計時。在掃描期間,它還提供一些狀態反饋,包括進度條。

就是我拍攝的是將在系統啓動時運行,而不需要用戶登錄的服務。這將由計劃的文件處理組成。但是,當用戶登錄時,我仍然希望加載托盤圖標,並允許他們打開一個GUI,如上所述監視服務的當前狀態,更改設置,手動啓動掃描並監視進度掃描。

我敢肯定,我已經看到了這樣的應用程序 - 這功能,即使我沒有登錄服務,但還是給我一個用戶界面,一次我登錄到工作

我在想,不是讓一個多線程應用程序從處理線程向GUI線程發送消息,而是需要兩個應用程序 - 一個執行處理的服務和一個GUI應用程序,以提供服務的可視反饋,還有將消息發送到服務(例如,手動啓動掃描)。但我是Windows服務新手,不知道如何完成這項工作。

這也可能是我完全脫離基地和服務不是我所期待的。

任何幫助/想法/建議將不勝感激!謝謝。

回答

5

你不能這樣做的服務。

您需要將Windows服務作爲普通的服務應用程序。這將在系統啓動時啓動,並在整個系統啓動時運行。

然後,您會創建一個完全獨立的GUI應用程序,它與服務「交談」。這可以設置爲在用戶登錄時在用戶的帳戶中運行。

爲了讓他們相互「交談」,您需要使用某種形式的IPC。由於它們運行在同一個系統上(但通常在不同的賬戶中),所以命名管道或套接字都可以很好地工作。

+0

謝謝你的迴應。我從來沒有處理IPC,但你的鏈接看起來會非常有幫助。我會看到我學到的東西。 – 2010-07-01 15:50:55

+0

+1。另請參閱下面的答案,瞭解如何設置將應用程序轉換爲服務的一些提示:http://stackoverflow.com/questions/1554047/convert-ac-program-to-a-windows-service/1554405#1554405 – 2010-07-01 15:51:59

+0

您可以通過配對的用戶界面和服務(兩個獨立的實體)來實現。該服務公開COM對象或RPC服務器,並且UI連接到COM對象/ RPC服務器以完成工作。 – 2010-07-02 04:08:10

0

有一個簡單的方法。

您不能讓服務訪問任何用戶的會話(會話1,2,3 ..),因爲服務是孤立的,只能訪問會話0。這是自2011年

改變你應該寫於每誰在使用https://msdn.microsoft.com/en-us/library/windows/desktop/ms682429(v=vs.85).aspx

該服務可以繼續執行,是不是特定於用戶的任何任務記錄每個用戶的服務啓動一個Win32程序。