windows service 與GUI視窗的實現

2022-02-14 22:17:52 字數 1719 閱讀 2433

以前做過幾次windows service,但都是沒有介面的,想配置引數都只能使用文字檔案,然後重啟服務才行,而且不能檢視服務的執行狀態。

最近在網上找到一些文章,終於找到可以啟動服務時有介面的方法。

首先服務工程中本身不能有窗體,這是windows系統本身不支援的。因此必須要有兩個工程才能實現,一是服務程式,另乙個是gui程式。

當服務程式啟動時通過**啟動gui程式,從而實現自動啟動gui程式,並且有介面展示。為了能讓服務程式能與gui程式通訊,可以在服務程式中建立乙個tcp server,

gui程式中建立乙個tcp client,這樣兩個程式之間即可實現通訊。

要使服務程式能開啟gui程式,並在視窗中顯示出來,必須在安裝服務之後設定其啟動帳號為」本地系統帳號「且「允許與桌面互動」。

而」本地系統帳號「這項可以在服務程式開發時設定,而「允許與桌面互動」必須要使用另外的途徑實現,請參考下面的**。

具體步驟:

先建立乙個winform 程式。

然後再建立乙個windows service project. (具體操作不在此說明)。

在serviceinstaller1_committed事件中新增如下**:

connectionoptions cooptions = new connectionoptions();

cooptions.impersonation = impersonationlevel.impersonate;

managementscope mgmtscope = new system.management.managementscope(@"root\cimv2", cooptions);

mgmtscope.connect();

managementobject wmiservice;

wmiservice = new managementobject("win32_service.name='" + serviceinstaller1.servicename + "'");

managementbaseobject inparam = wmiservice.getmethodparameters("change");

inparam["desktopinteract"] = true;

managementbaseobject outparam = wmiservice.invokemethod("change", inparam, null);

此段**即是將此service設定為「允許與桌面互動」,有了此選項之後,服務啟動時gui程式的介面將會出現。

編譯之後,將gui程式放在合適的位置,安裝服務,並設定為自啟動服務,針對windows2000/xp系統,啟動服務時將會出現gui程式的介面,如果呼叫沒有出錯的話。

要注意的是在windows 2003上啟動服務時介面可能不會出現(雖然在服務管理器中「允許與桌面互動」已經勾上),但程式已經在執行(通過任務管理器檢視)。

有兩個解決辦法,一是重啟機器;二是在「服務管理器」中手工重新設定一下「允許與桌面互動」,然後確定,此時再啟動服務即可(其實未做任何修改,搞不懂ms的東西為什麼會這樣,跟蹤了登錄檔,也沒看到有變化)。

使用雙程序實現服務和gui的好處是,可以隨時檢視服務的狀態,並且gui程式當掉之後,服務程式可以自動將其啟動,有點象木馬了。

中國人自己做的,將任何程式做成服務啟動程式的工具:

另乙個講述如何自動設定「允許與桌面互動」選項的,未成功,不知重啟之後是否有效。

另一篇說明如何設定「允許與桌面互動」選項的

windowsservice建立心得

1,新建乙個windows服務為 filetranceservice,2,新增timer,該timer是 system.timers,注意 看看這個 timer 控制項的屬性中的命名空間是什麼 如果是 system.timers.timer 那就對了 如果是 system.windows.froms...

Windows Service學習筆記

windows服務程式是windows作業系統下能完成特定功能的可執行程式。它適合需要長時間執行的功能使用。建立完成後,看到如下圖所示 將service1的名稱改成你需要的名稱,例如 helloservice 修改安裝服務名稱 修改安裝許可權 完成上面的步驟後,就可以開始我們的程式啦。主要使用到on...

Windows Service獲取執行目錄的方法

一般獲取目錄方法 首先要弄清你對 當前目錄 current directory 的定義是什麼。工作目錄 你的應用程式正在哪個目錄下工作。這個目錄並不一定是exe檔案所在的目錄,而且在程式執行中是可以改變的。system.io.directory類提供了getcurrentdirectory方法,該方...