这个问题以前有人问过,但没有确定的答案。
我在 Delphi 中编写了一个 Windows 服务,它需要在特定条件下生成哔声。这在 XP 上运行良好,但在 Windows 7 或 2008 中失败。
笔记:
- 如果我使用 PC 扬声器创建控制台程序而不是服务,Beep 可以工作。
- 即使我启用“允许服务与桌面交互”或什至为服务分配管理员权限,Beep 也无法在服务中工作。
我的问题:有没有办法可以调用 beep API 使其在服务中工作?谢谢。
这个问题以前有人问过,但没有确定的答案。
我在 Delphi 中编写了一个 Windows 服务,它需要在特定条件下生成哔声。这在 XP 上运行良好,但在 Windows 7 或 2008 中失败。
笔记:
我的问题:有没有办法可以调用 beep API 使其在服务中工作?谢谢。
You can't do this in Vista and up. Services run in a different session and so don't have access to the speaker.
更新: 有人在这里找到了方法。它涉及 IOCTL,可用于驱动程序和服务。
原答案:
我知道与用户交互的唯一方法是让您的服务与一个小的用户代理进程通信,该进程将被添加到 HKEY_LOCAL_MACHINE\CurrentUser\Run 以自动运行。
这是 vista 和 win7 中的常见模式,其中无法直接从服务进行用户交互:
MyLittleService.exe 无权访问用户。但它可以通过命名管道与托盘图标实用程序进行通信。
MyLittleTrayIcon.exe 与服务通信,也可以被告知通过消息框向用户发出信号,通过任何方法发出哔哔声(Windows 声音效果可能比尝试访问不能保证在每台 PC 上都存在的 PC 扬声器更好) 等,甚至可以用来控制服务(重新启动它,重新加载配置等)。