Воспроизведение волнового файла из службы Windows (C #) - PullRequest
4 голосов
/ 27 января 2010

Мне нужно воспроизвести файл wav из приложения C #, работающего в качестве службы Windows. Я пробовал и System.Media.SoundPlayer и P / Invoke вызов WinMM.dll (что, вероятно, делает SoundPlayer).

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

Если я запускаю свой код как консольное приложение, звуки воспроизводятся. Когда я запускаю его из службы, не повезло, и, думаю, я не удивлен.

Так есть ли способ воспроизвести звук из службы Windows? Поможет ли что-то вроде DirectSound? Или я застряну, когда пишу консольное приложение, а приложение службы Windows связывается с ним в качестве посредника?

Заранее спасибо

Ответы [ 4 ]

9 голосов
/ 04 февраля 2010

Воспроизведение wav-файла из службы, безусловно, возможно, по крайней мере в Windows 7 (и, скорее всего, в Vista), с помощью Windows Core Audio API. Недавно я проверил это, сделав небольшой тестовый сервис с использованием NAudio . Я только что скачал исходники NAudio и скопировал части "Wsapi" из их проекта NAudioDemo. Это было на Windows 7 Enterprise 64bit, но я не думаю, что это имеет значение. Служба использовала учетную запись LocalSystem.
Для записи, воспроизведение звуков из сервиса - совершенно законная вещь во встроенных настройках.

1 голос
/ 05 июня 2012

Применение NAudio для простого воспроизведения аудиофайла.
http://bresleveloper.blogspot.co.il/2012/06/c-service-play-sound-with-naudio.html

0 голосов
/ 27 июня 2017

Вы можете сделать это через API PlaySound через winmm.dll, в Windows Vista или выше. Microsoft добавила отдельный сеанс для «системных звуков», который можно использовать даже в сервисах, просто добавив флаг.

Я правильно отформатировал это, чтобы избежать проблем с IDE c # 2017, которая выбрасывает колебание поверх DllImport, отсутствующего в классе с именем '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 голосов
/ 27 января 2010

Вы выбрали неправильный тип приложения. Служба Windows предназначена для более продолжительных приложений, которые выполняются не в интерактивном режиме, независимо от того, вошел ли кто-либо в компьютер. Например, SQL Server, IIS и т. Д.

Вам также запрещено в Windows Vista и более поздних версиях отображать окна пользовательского интерфейса из службы Windows. Для Windows XP, 2000 Server и вы можете отобразить MessageBox, однако это не рекомендуется для большинства служб.

Таким образом, в общем, сервисам не разрешается быть «интерактивными», включая воспроизведение звуков, мультимедиа и т. Д.

Вам нужно либо изменить тип приложения на обычное консольное приложение или приложение Windows Forms, либо жить без воспроизведения звуков из вашего сервиса.

Для получения дополнительной информации см. Эту страницу на интерактивных службах и связанных страницах в MSDN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...