繁体   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