2010-05-07 56 views
18

您能從Windows服務中顯示消息框(或任何形式的通知)嗎?無法讓它工作。我用:從Windows服務中顯示消息框

  global::System.Windows.Forms.MessageBox.Show("A fatal error occurred. " + 
       ServiceName + " is now terminating."); 

但它沒有工作,只是產生了一個錯誤。

回答

19

不,您不能從服務中顯示消息框。如果您想報告錯誤,則執行此操作的標準方法是使用event log

對於更多「高級」類型的UI(不僅僅是錯誤報告),通常通過一個常規的Windows應用程序放入用戶的Startup文件夾(或註冊表中的Run鍵)通過某種IPC機制(.NET遠程處理,WCF,常規套接字,命名管道等)與服務進行對話。

+0

哦..我希望有一個通用的異常處理程序,當服務發生錯誤時會通知用戶。在某些情況下,它會沉默地崩潰,用戶不會意識到服務已經崩潰。 – Jonn 2010-05-10 07:51:51

+0

我試圖調試時一直使用消息框。這是查找可能發生的問題的快捷方式。切勿在發佈中使用消息框!構建發佈時始終使用事件日誌!要使用消息框進行調試,只需將System.Windows.Forms引用添加到項目中即可。 – 2014-06-10 18:45:06

+0

我想通知用戶我不能做事件記錄。但唯一的方法是通過記錄事件?尷尬了。 – user922020 2017-11-02 17:28:00

-2

不,你不能。 Windows服務沒有GUI。但是您可以顯示一些系統托盤通知。

+1

我不認爲你可以做到這一點,因爲他們沒有與桌面互動。 – SqlRyan 2010-05-07 06:33:17

+0

你介意給我舉個例子嗎?我還沒有考慮過這種可能性。 – Jonn 2010-05-10 08:57:38

+0

@Jonn:我沒有爲自己做過,但這可以幫助你:http://msdn.microsoft.com/en-us/magazine/cc188923.aspx。使用P/Invoke與操作系統交談。不要直接調用任何GUI組件,這一點很重要,因爲Windows服務無法通過設計獲得GUI。 – Marcel 2010-05-10 13:00:48

0

Wikipedia

雖然一般服務沒有用戶界面,開發人員可以添加表格和其他UI組件。在這種情況下,應在服務屬性對話框的登錄選項卡上檢查「允許服務與桌面交互」(儘管應該小心使用此方法,因爲這可能導致安全風險,因爲任何登錄用戶都會能夠與服務交互)。

啓用此選項後,您應該能夠顯示來自服務的消息框。

+0

你可以在代碼中啓用它? – Jonn 2010-05-10 08:58:48

+0

@Jonn:我想在代碼中有一些API需要修改,但通常不應該依賴這個選項。 – Gart 2010-05-10 11:56:02

0

允許服務與桌面交互將幫助您從Services.msc控制檯執行此操作。

但是,這是一個非常糟糕的主意。特別是如果您稍後忘記刪除此消息框。該服務將掛起,因爲您將有一個無法點擊的消息框。

-1

操作系統:XP 啓用互動模式的Windows服務

程序

  1. 打開服務控制面板。例如:開始>控制面板>管理工具>服務。
  2. 選擇鑄鐵安全連接器服務。
  3. 右鍵單擊服務名稱,然後選擇「屬性」。顯示服務屬性窗口。
  4. 選擇登錄選項卡。
  5. 選擇本地系統帳戶,然後選擇允許服務與桌面交互。
  6. 單擊確定。
  7. 單擊重新啓動。
+1

這已超過10年。它在Windows Vista及更高版本中不受支持。 – 2012-02-13 08:38:39