在 Windows 2008/7/Vista 中使 Windows 服务蜂鸣

Posted

技术标签:

【中文标题】在 Windows 2008/7/Vista 中使 Windows 服务蜂鸣【英文标题】:Making Windows service beep in Windows 2008/7/Vista 【发布时间】:2011-05-12 16:49:44 【问题描述】:

以前有人问过这个问题,但没有确定的答案。

我在 Delphi 中编写了一个 Windows 服务,它需要在特定条件下发出哔声。这在 XP 上运行良好,但在 Windows 7 或 2008 中失败。

注意:

    如果我使用 PC 扬声器创建控制台程序而不是服务,Beep 可以工作。 即使我启用“允许服务与桌面交互”甚至为服务分配管理员权限,Beep 也无法在服务中工作。

我的问题:有没有一种方法可以调用 beep API 以便它在服务中工作?谢谢。

【问题讨论】:

“允许服务与桌面交互”在 Windows 6.0 及更高版本中无效 机器上是否有人登录过? @Paul Betts - 不一定,如果电脑正在重新启动,服务仍会自动启动。然而,如果用户希望配置软件,他可以登录。谢谢。 【参考方案1】:

您无法在 Vista 及更高版本中执行此操作。服务在不同的会话中运行,因此无法访问扬声器。

【讨论】:

那么他们不能启动一个单独的 EXE 来发出哔哔声吗? @Hossein,一个单独的 EXE 通常会在与启动它的进程相同的会话下运行。该服务需要为某个交互式用户找到一个会话,模拟该用户的凭据,然后在该其他会话中运行产生噪音的过程。 David/Rob - 为什么不在注册表中添加一个 trayicon.exe 迷你应用程序,以便为每个登录的用户自动运行?如今,VMWare、Interbase 和其他所有服务都有一个托盘图标应用程序,只需让它发出哔哔声。 (实际上我把它作为答案) @warren 显然就是这样做的。但是对于想要在服务中做到这一点,问题似乎很坚定。 @David - 有问题的服务实际上是一个监控软件,所以警报是主要功能。目前,它使用 GSM 手机通过电子邮件或 SMS 发送警报 - 但有时,没有互联网或 GSM 手机已关闭 - 这就是我需要发出蜂鸣器警报的地方。【参考方案2】:

更新:有人找到了方法here。它涉及 IOCTL,可供驱动程序和服务使用。

原答案:

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

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

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

    MyLittleTrayIcon.exe 与服务通信,并且还可以被告知通过消息框向用户发出信号,通过任何方法发出哔哔声(Windows 声音效果可能比尝试访问无法保证的 PC 扬声器更好不再存在于每台 PC 上)等,甚至可以用于控制服务(重启、重新加载配置等)。

【讨论】:

P,感谢您提出这个建议。我确实有一个托盘图标来显示气球警报,所以我可以让托盘图标发出哔哔声,但一个问题是除非用户登录,否则它不起作用。 “小型用户代理进程”——即使没有登录,这个代理也能运行吗? 据我所知,不,如果用户没有登录它就不会运行。但是微软已经主动阻止你做任何其他事情。 P - 我想系统托盘方法是最好的,除非我能找到一个带有蜂鸣器的特殊 USB 设备并从服务中发出声音。 ;) 你从后台发送短信到你的手机怎么样? :-) 然后你可以通知那些听不到哔哔声的人。 哔声实际上是在短信设备不工作时通知人们。托盘方法不完整,因为用户必须登录。 ;)

以上是关于在 Windows 2008/7/Vista 中使 Windows 服务蜂鸣的主要内容,如果未能解决你的问题,请参考以下文章

如何在VB.Net中使窗体出现在Windows 10的所有桌面中?

如何在 windows 应用程序 c# 中使 paypal 到 paypal 支付 api 集成

如何使用 FLTK 在 Windows、Mac OS X 和 Linux 中使窗口透明?

如何在wpf应用程序中使Textbox成为数字

如何在 JSF 2.0 中使会话无效?

在 UITableViewCell 中使 UIView 出队