Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.Media.SoundPlayer在windows服务应用程序中不工作_C#_Windows Services_Soundplayer - Fatal编程技术网

C# System.Media.SoundPlayer在windows服务应用程序中不工作

C# System.Media.SoundPlayer在windows服务应用程序中不工作,c#,windows-services,soundplayer,C#,Windows Services,Soundplayer,我有一个简单的服务,代码如下: 在Program.Main方法中,我有由vs itself2010生成的代码: static void Main() { ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new Service1() }; ServiceBase.Run(ServicesToRun);

我有一个简单的服务,代码如下:

在Program.Main方法中,我有由vs itself2010生成的代码:

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-I使用installUtill.exe安装服务。 2-服务在localSystem帐户权限下运行。 3-所述.wav文件的持续时间为3秒

我怎样才能播放那个声音?
提前谢谢。

简单的答案是你不能。Windows服务不与桌面交互,因此无法使用音频服务等桌面功能

请记住,Windows是一个多用户操作系统。你能想象如果5个同时登录的用户开始播放音频会发生什么吗

所有用户都有所谓的Windows工作站,并且有一个特殊的Windows工作站供登录到物理计算机的用户使用。Windows服务具有空或唯一的非交互式Windows工作站,因此无法与控制台WS交互

此Windows工作站用于重定向音频,控制台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中编写一个播放声音的程序,并告诉事件查看器每次写入此条目时都执行此程序每次服务启动时都可以播放来自windows服务的声音


播放服务中的声音并不违反交互规则,因为它不是一个交互功能:它是一个通知。

感谢您的指导。但我需要播放它:如何在服务和windows应用程序之间进行交互?@AliRashidi-Microsoft的政策是,如果需要这样做,那么您应该运行一个用户应用程序,通过TCP/IP、管道或共享内存与您的服务交互,并让您的用户应用程序播放声音。这就是防病毒等服务的工作方式。他们有一个客户端,当用户登录与服务交互时运行。这看起来很复杂。非常感谢埃里克:p@AliRashidi-是的,很复杂。因为做任何其他事情都是不负责任的。我会极力劝阻任何人使用这种技术。除了你现在让操作系统做你的应用程序应该做的工作之外,这是一个配置噩梦,在升级操作系统时很可能会被重置。最重要的是,如果你需要把它分发给其他用户,这将是一个巨大的痛苦。最后,它将用无用的事件填充您的事件日志,这可能会很快滚动掉您需要的事件。这只是一个糟糕的设计,一个巨大的漏洞。如果这是您想要采取的方法,我会创建一个运行声音程序的计划任务,将计划任务设置为以登录用户的身份运行,然后将任务设置为没有计划,但在您需要时使用计划任务API触发作业。这样,您就不会填写事件日志。仍然是一个巨大的黑客,但比这个解决方案更好。你完全正确@ErikFunkenbusch,但现在没有任何其他方法来实现我想要的。看起来是这样的 无法播放服务中的声音,这是唯一的方法。此外,我们可以手动或自动清除日志,只要我们想要可能的副本