![](/img/trans.png)
[英]Playing Windows System Sounds with System.Media.SoundPlayer
[英]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执行该程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.