簡體   English   中英

System.Media.SoundPlayer在Windows Service應用程序中不起作用

[英]System.Media.SoundPlayer does not work in windows service applications

我有以下代碼的簡單服務:

在Program.Main方法上,我有vs本身生成的代碼(2010年):

static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
        { 
            new Service1() 
        };
        ServiceBase.Run(ServicesToRun);
    }

在Service1.cs中,我有:

 protected override void OnStart(string[] args)
    {
        System.Media.SoundPlayer myPlayer = new System.Media.SoundPlayer(@"C:\doorbell-1.wav");
        myPlayer.Play();
    }

    protected override void OnStop()
    {
    }

我省略了編寫通常自動生成的C#代碼以降低復雜性的步驟。

從邏輯上講,當我啟動服務時應該播放聲音,但是當我啟動服務時什么也沒有發生。 請注意:

1-我使用installUtill.exe安裝服務。 2-該服務在localSystem帳戶特權下運行。 提到的.wav文件的3個持續時間為3秒。

如何播放聲音? 提前致謝。

簡單的答案是,你做不到。 Windows服務不會與桌面交互,因此它們無法使用桌面功能,例如音頻服務。

請記住,Windows是一個多用戶操作系統。 您能想象如果同時登錄的5個用戶開始播放音頻會發生什么情況?

所有用戶都具有所謂的“ Windows Station”,並且有一個特殊的Windows Station供用戶登錄物理計算機。 Windows服務具有空的或唯一的(非交互式)Windows Station,因此無法與控制台WS進行交互。

該Windows Station用來重定向音頻,控制台WS中的音頻傳遞給揚聲器。 所有其他音頻或者重定向到他們正在使用的網絡站,或者什么都不做。

一個更復雜的答案是可能的,因為Windows音頻服務本身就是另一項服務,您也許可以直接與之交互,但這可能是一個很低的水平,並且您可能不夠熟練。

最后,可以使服務與桌面進行交互。 但是,此功能被認為已棄用,並不總是易於使用。 這也是一個巨大的安全漏洞,使您的服務易於被惡意軟件破壞計算機。

昨晚我一直在整個互聯網上搜尋。 這個問題已經回答了很多次,但從未給出簡單的答案。 如果您有相同的問題,則在服務要求時,有一種非常簡單但棘手的方法來做某事。

假設您要在服務啟動時播放歌曲。

首先創建一個EventLog類:

public class EventLogEngine
{
    private string _sourceName, _logName;
    public EventLogEngine(string sourceName, string logName)
    {
        if (!EventLog.SourceExists(sourceName))
            EventLog.CreateEventSource(sourceName, logName);
        _sourceName = sourceName; _logName = logName;
    }
    public void WriteLog(string message, EventLogEntryType eventType, int Id)
    {
        EventLog.WriteEntry(_sourceName, message, eventType, Id);
    }
}

protected override void OnStart(string[] args)
{
 EventLogEngine eventWriter = new EventLogEngine("mySource","myLog");
eventWriter.WriteLog("sourceName","Service started",EventLogEntryType.Information,"anyId");
}

直到這里都沒有播放聲音的痕跡,而且還沒有什么復雜的。 但是如何播放聲音或做其他事情呢? 這是答案:)

1-轉到控制面板並打開事件查看器

2-找到您的事件日志,然后單擊它

在此處輸入圖片說明

3-在右側面板上,您將看到通過代碼編寫的條目。

4-右鍵單擊條目,然后選擇“將任務附加到此事件”!

在此處輸入圖片說明

到目前為止,您應該已經了解我將要做什么。 對?

5-選擇該選項,並聲明設置此條目后要執行的操作。 您可以簡單地附加任意數量的任務。

在此處輸入圖片說明

現在,編寫一個播放聲音的程序(例如,在vb6中),並在每次寫入該條目時(每次啟動服務時)告訴Event Viewer執行該程序。

可以從一個窗口服務播放聲音。

從Windows服務(C#)播放wave文件

從服務播放聲音不會違反交互規則,因為它不是交互功能:它是通知。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM