Воспроизведение голоса через модем из службы Windows - PullRequest
2 голосов
/ 18 июня 2010

Я занимаюсь разработкой службы VB.NET для Windows, которая постоянно проверяет базу данных BMS на наличие новых аварийных сигналов и делает телефонные звонки для удаленного предупреждения операторов.В настоящее время я использую оболочку .NET TAPI и сборку взаимодействия SAPI 5.3, и я говорю по телефону:

  1. Инициализация интерфейса TAPI;
  2. Выполните вызов на номер оператора;
  3. Возьмите идентификатор устройства waveOut голосового модема
  4. Установите для голосового выхода идентификатор этого устройства;
  5. Пусть SAPI сотворит волшебство.

Это все работает нормально, если я компилирую код как консоль Windows или приложение форм, но как только я компилирую и запускаю его как службу Windows, шаг 5 никогда не происходит - голосовой модем вызывает, но молчит;все остальное работает, даже цифровой контроль.Теперь я знаю, что Windows-сервисы не должны взаимодействовать с рабочим столом, поэтому такие вещи, как элементы пользовательского интерфейса и воспроизведение звуков, запрещены, но я изо всех сил пытаюсь найти альтернативу, которая не связана с использованием Wave API и может быть разработана.в разумные сроки.Есть идеи?

Ответы [ 2 ]

0 голосов
/ 25 июня 2010

Я закончил ссылками на проект Windows Form в своем проекте Windows Service и создал форму в подпункте OnStart:

Protected Overrides Sub OnStart(ByVal args() As String)
        HelperThread = New Threading.Thread(AddressOf CreateMOWindow)
        HelperThread.TrySetApartmentState(Threading.ApartmentState.STA)
        HelperThread.Start()
End Sub 

Private Sub CreateMOWindow()
        Dim frm As New AlarmVoiceTest.AlarmVoiceTest
        Windows.Forms.Application.Run(frm)
End Sub

Форма, конечно, не отображается (но я ненужно) и SAPI работает как положено.Я считаю, что это не самый чистый способ сделать это, но у меня вроде бы не хватает времени:)

0 голосов
/ 21 июня 2010

SAPI, как правило, нужен какой-то насос сообщений и дескриптор окна, которого службы Windows обычно не имеют.Вы могли бы создать окно только для сообщений , чтобы обрабатывать сообщения немного более безопасным способом (обратите внимание, что любой hwnd в сервисе откроет вам до разбойной атаки , поэтому убедитесь, что вызапускаете ваш сервис как пользователь, а не как SYSTEM или LocalMachine, чтобы уменьшить поверхность атаки).Вам также нужно будет прокачать сообщения (через Приложение .Run или Application.DoEvents или тому подобное).

...