【问题标题】:Invoke a windows application from a windows service on system shutdown在系统关闭时从 Windows 服务调用 Windows 应用程序
【发布时间】:2009-12-19 07:21:36
【问题描述】:

我正在用 C# 在 .Net 3.5 中开发 Windows 服务。此服务用于定期调用 Windows 窗体。现在我想将事件挂钩到服务,这样当用户尝试关闭系统时,也会出现 windows 窗体,从而阻止关闭过程.用户只能通过windows应用程序关闭系统。

有没有办法在 Windows 服务中做到这一点?

编辑

我希望在仅限 Win 2000 和 Win XP 中完成此操作。

谢谢

【问题讨论】:

    标签: c# windows-services detect system-shutdown


    【解决方案1】:

    服务不应与用户会话交互。在 Vista 和 Win7 中,这实际上是被禁止的。与用户会话交互的正确方法是在会话中拥有一个与服务通信的应用程序,因此您创建定期启动表单的服务的方法是有缺陷的。防止系统关闭听起来同样糟糕,Win7 将再次覆盖您的应用程序,显示一个暗淡的屏幕,建议用户杀死破坏者(这是行为不端的应用程序,你的)。

    以您建议的方式改变用户体验的合法应用程序具有适当的 API 来执行此操作,例如 shell 替换。

    【讨论】:

    • 服务/应用对的应用部分可以响应关闭事件,msdn.microsoft.com/en-us/library/aa376890(VS.85).aspx。不是服务。考虑没有用户登录但服务正在运行的情况。或者当有多个用户登录远程终端服务时。
    • 虽然服务也可以接收关闭通知,请参阅msdn.microsoft.com/en-us/library/ms685058(VS.85).aspx,但它不应该向用户显示对话框。
    • 您可能还会在关机期间尝试执行新程序时遇到问题...如果您曾经尝试在关机后运行程序,您会收到消息“无法完成请求:正在关机”。所以可能会有一些限制。
    • 迈克也是对的。您将无法加载新模块。当有一个完全合法的方法时,您正在尝试实现一个可怕的 hack:一个在用户会话中运行并与服务通信的交互式应用程序(典型的“托盘图标”应用程序)。
    • 尽管所有建议都有效,但我猜 adamantium 只想为自己而不是为公众编写一个应用程序,以防止关闭,即除非绝对确定,否则不应关闭服务器(因此警告/形式/任何)。在那种情况下,我会建议一个弹出对话框的服务“真的关闭了吗?”在关闭事件上使用 Ok 和 Cancel,如果可能,使用关闭取消事件参数。
    猜你喜欢
    • 2013-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    相关资源
    最近更新 更多