2 votes

Jouer la voix sur modem à partir d'un service Windows

Je développe un service Windows VB.NET qui vérifie constamment une base de données BMS pour les nouvelles alarmes et qui passe des appels téléphoniques pour avertir les opérateurs à distance. J'utilise actuellement un wrapper .NET TAPI et l'assemblage interop SAPI 5.3, et les étapes que je suis en train de suivre pour parler au téléphone sont les suivantes :

  1. Initialiser l'interface TAPI ;
  2. Appelez le numéro de l'opérateur ;
  3. Prendre l'identifiant du modem vocal waveOut device id
  4. Régler la sortie vocale sur l'identifiant de l'appareil ;
  5. Laissez SAPI faire la magie.

Tout fonctionne bien si je compile le code en tant qu'application Windows console ou formulaire, mais dès que je le compile et l'exécute en tant que service Windows, l'étape 5 ne se produit jamais - le modem vocal appelle mais reste silencieux ; tout le reste fonctionne, même la surveillance des chiffres. Je sais que les services Windows ne sont pas censés interagir avec le bureau, donc des choses comme les éléments de l'interface utilisateur et la lecture de sons sont à proscrire, mais j'ai du mal à trouver une alternative qui n'implique pas l'utilisation de l'API Wave et qui puisse être développée dans un délai raisonnable. Des idées ?

0voto

Eric Brown Points 9233

SAPI a généralement besoin d'une sorte de pompe à messages et d'une poignée de fenêtre, ce que les services Windows n'ont généralement pas. Vous pouvez créer un fenêtre de message uniquement pour traiter les messages d'une manière un peu plus sûre (notez que tout hwnd dans un service vous ouvre la voie à un attaque en éclats Pour réduire la surface d'attaque, assurez-vous que vous exécutez votre service en tant qu'utilisateur, et non en tant que SYSTEM ou LocalMachine). Vous devrez également pomper les messages (via Application .Run ou Application.DoEvents ou autres).

0voto

Samuele Points 61

J'ai fini par faire référence au projet Windows forms dans mon projet Windows Service, et par créer le formulaire dans le sous-projet 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

Le formulaire ne s'affiche pas bien sûr (mais je n'en ai pas besoin), et SAPI fonctionne comme prévu. Je pense que ce n'est pas la façon la plus propre d'y parvenir, mais je manque un peu de temps :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X