Play wave file from windows service (C #)

I need to play a wav file from a C # application running as a windows service. I tried both System.Media.SoundPlayer and the P / Invoke call for WinMM.dll (which SoundPlayer probably does).

[DllImport("WinMM.dll")] private static extern bool PlaySound(string fname, int Mod, int flag); 

If I run my code as a console application, sounds play. When I run it from the service, I’m out of luck, and I think I'm not surprised.

So, is there a way to play sound from a windows service? Would it be something like DirectSound help? Or am I going to get stuck in writing a console application and have an application to connect to Windows with it as an intermediary?

Thanks in advance

+4
source share
4 answers

Playing a wav file from a service is certainly possible, at least in Windows 7 (and most likely in Vista) using the Windows Core Audio APIs. I recently tested this by doing a little test service using NAudio . I just downloaded the NAudio sources and copied the β€œWsapi” parts from my NAudioDemo project. It was on Windows 7 Enterprise 64bit, but I don’t think it matters. The service used the LocalSystem account.
For recording, sounds played through the service are perfectly legal to do so in the built-in setup.

+9
source

You have selected the wrong type of application. The Windows service is designed for longer-running applications that run non-interactively, regardless of whether someone logs on to the computer. For example, SQL Server, IIS, etc.

You are also prohibited from displaying user interface windows from a Windows service in Windows Vista and later. For Windows XP, 2000 Server and you can display a MessageBox, however this is not recommended for most services.

Thus, in the general case, services are not allowed "interactively", this includes the reproduction of sounds, multimedia, etc.

You need to either change the application type to the regular Console / Windows Forms application, or live without playing sounds from your service.

For more information, see this page in the online services and related pages on MSDN.

0
source

Applies NAudio to simply allow playback of an audio file.
http://bresleveloper.blogspot.co.il/2012/06/c-service-play-sound-with-naudio.html

0
source

You can do this through the PlaySound API through winmm.dll, in Windows Vista or higher. Microsoft has added a separate session for System Sounds, which can be used even from services by simply adding a flag.

I formatted it correctly to avoid problems with the C # 2017 IDE by throwing shaky over DllImport without being in a class named "NativeMethods".

 using System.Runtime.InteropServices; namespace Audio { internal static class NativeMethods { [DllImport("winmm.dll", EntryPoint = "PlaySound", SetLastError = true, CharSet = CharSet.Unicode, ThrowOnUnmappableChar = true)] public static extern bool PlaySound( string szSound, System.IntPtr hMod, PlaySoundFlags flags); [System.Flags] public enum PlaySoundFlags : int { SND_SYNC = 0x0000,/* play synchronously (default) */ SND_ASYNC = 0x0001, /* play asynchronously */ SND_NODEFAULT = 0x0002, /* silence (!default) if sound not found */ SND_MEMORY = 0x0004, /* pszSound points to a memory file */ SND_LOOP = 0x0008, /* loop the sound until next sndPlaySound */ SND_NOSTOP = 0x0010, /* don't stop any currently playing sound */ SND_NOWAIT = 0x00002000, /* don't wait if the driver is busy */ SND_ALIAS = 0x00010000,/* name is a registry alias */ SND_ALIAS_ID = 0x00110000, /* alias is a pre d ID */ SND_FILENAME = 0x00020000, /* name is file name */ SND_RESOURCE = 0x00040004, /* name is resource name or atom */ SND_PURGE = 0x0040, /* purge non-static events for task */ SND_APPLICATION = 0x0080, /* look for application specific association */ SND_SENTRY = 0x00080000, /* Generate a SoundSentry event with this sound */ SND_RING = 0x00100000, /* Treat this as a "ring" from a communications app - don't duck me */ SND_SYSTEM = 0x00200000 /* Treat this as a system sound */ } } public static class Play { public static void PlaySound(string path, string file = "") { NativeMethods.PlaySound(path + file, new System.IntPtr(), NativeMethods.PlaySoundFlags.SND_ASYNC | NativeMethods.PlaySoundFlags.SND_SYSTEM); } } } 
0
source

Source: https://habr.com/ru/post/1299493/


All Articles