我正在开发一个 VB.NET Windows 服务,该服务持续检查 BMS 数据库是否有新警报,并拨打电话远程警告操作员。我目前正在使用 .NET TAPI 包装器和 SAPI 5.3 互操作程序集,我通过电话交谈的步骤是:
- 初始化TAPI接口;
- 拨打接线员的电话号码;
- 获取语音调制解调器waveOut设备id
- 将语音输出设置为该设备ID;
- 让 SAPI 施展魔法。
如果我将代码编译为 Windows 控制台或表单应用程序,这一切都工作正常,但一旦我将其编译为 Windows 服务并运行,第 5 步就永远不会发生 - 语音调制解调器呼叫但保持沉默;其他一切都正常,甚至数字监控。
现在我知道 Windows 服务不应该与桌面交互,因此 UI 元素和播放声音之类的东西是禁忌,但我正在努力寻找一种不涉及使用 Wave API 并且可以开发的替代方案在合理的时间范围内。有任何想法吗?
SAPI 通常需要某种消息泵和窗口句柄,而 Windows 服务通常没有这些。你可以创建一个仅消息窗口 http://msdn.microsoft.com/en-us/library/ms632599(VS.85).aspx以稍微安全的方式处理消息(请注意,服务中的任何 hwnd 都会向您开放粉碎攻击 http://en.wikipedia.org/wiki/Shatter_attack,因此请确保您以用户身份运行服务,而不是以 SYSTEM 或 LocalMachine 身份运行,以减少攻击面)。您还需要泵送消息(通过应用 http://msdn.microsoft.com/en-us/library/9398s20y.aspx.Run 或 Application.DoEvents 等)也是如此。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)