在Windows 2008/7/Vista中让Windows服务发出蜂鸣声

4

这个问题以前也被问过,但没有定论。

我用Delphi写了一个Windows服务,需要在某些条件下发出蜂鸣声。在XP上运行得很好,但在Windows 7或2008上失败了。

注意:

  1. 如果我创建一个控制台程序而不是服务,使用PC扬声器,蜂鸣声可以正常工作。
  2. 即使我启用“允许服务与桌面交互”或将管理员权限分配给服务,蜂鸣声也不能在服务中工作。

我的问题:是否有一种方法可以调用蜂鸣API,使其在服务中工作?谢谢。


在Windows 6.0及更高版本中,“允许服务与桌面交互”没有作用。 - user422039
机器上是否有其他人登录过? - Ana Betts
@Paul Betts - 不一定,如果计算机正在重新启动,则服务仍将自动启动。 但是,用户可以登录以配置软件。谢谢。 - Joshua Lim
2个回答

1

更新:有人在 这里 找到了一种方法。它涉及IOCTL,并可用于驱动程序和服务。

原始答案:

我所知道的唯一与用户交互的方式是让您的服务与一个小型用户代理进程通信,该进程将被添加到HKEY_LOCAL_MACHINE\CurrentUser\Run中以自动运行。

这是在vista和win7中无法直接从服务进行用户交互的常规模式:

  1. MyLittleService.exe无法访问用户。但是它可以通过命名管道与托盘图标实用程序通信。

  2. MyLittleTrayIcon.exe与服务通信,还可以告诉用户使用消息框、蜂鸣和其他方法(Windows声效可能比尝试访问不再保证存在于每台PC上的PC扬声器要好),甚至可以用来控制服务(重新启动它、重新加载配置等)。


P,谢谢您提出这个问题。我有一个托盘图标可以显示气球通知,所以我可以让托盘图标发出哔哔声,但是一个问题是,除非用户登录,否则它无法正常工作。“小型用户代理进程” - 这个代理能否在未登录的情况下运行? - Joshua Lim
据我所知,如果用户没有登录,它是无法运行的。但是微软已经积极地阻止你做任何其他事情。 - Warren P
P - 我想系统托盘方法是最好的,除非我能找到一个带有蜂鸣器的特殊USB设备并从服务中发出声音。 ;) - Joshua Lim
你可以从后台服务向你的手机发送短信,这样你就可以通知那些无法听到提示音的人了。 :-) - Warren P
蜂鸣声实际上是用来通知人们短信设备不工作的。托盘方法不完整,因为用户需要登录。 ;) - Joshua Lim

1

在Vista及以上版本中,您无法这样做。服务在不同的会话中运行,因此无法访问扬声器。


那么他们不能启动一个独立的EXE来发出蜂鸣声吗? - Hossein
1
@Hossein,单独的EXE通常会在启动它的进程的同一会话下运行。服务需要找到某个交互式用户的会话,模拟该用户的凭据,然后在该其他会话中运行产生噪音的进程。 - Rob Kennedy
@warren 显然那是正确的做法。但问题似乎坚决要在服务中完成它。 - David Heffernan
@David- 该服务实际上是一款监控软件,因此警报是主要功能。当前,它使用电子邮件或GSM手机短信发送警报,但有时候没有互联网或GSM手机无法使用-这就是我需要发出蜂鸣器警报的地方。 - Joshua Lim
@Joshua 好的,无论你在做什么,你都不能从服务中发出蜂鸣声。相反,你需要在当前交互会话中运行一个应用程序。 - David Heffernan
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接