【问题标题】:Spawning child processes in a screensaver在屏幕保护程序中生成子进程
【发布时间】:2011-06-20 21:17:27
【问题描述】:

我有一个用 .NET / C# 编写的屏幕保护程序,它依赖于正在运行的后台进程。虽然后台进程在安装时添加到用户的启动程序中,但在安装屏幕保护程序后不要求用户重新启动计算机仍然会很好。该进程本身必须在当前用户的凭据下运行,因此使用 Windows 服务是不可能的。

我想到的最好的解决方案是在屏幕保护程序启动时检测后台进程是否正在运行,如果不是,则启动它,只需使用.NET的 Process 类。但是,我注意到这样做有两个相关的问题:

1) Windows 似乎总是认为屏幕保护程序正在运行,而屏幕保护程序进程或由屏幕保护程序创建的任何子进程仍在运行。这样做的最终结果是屏幕保护程序将自行启动并生成进程,但永远不会再次启动,因为 Windows 认为第一个屏幕保护程序仍然处于活动状态,因为后台进程仍在运行。

2) 如果计算机设置为在屏幕保护程序弹出时锁定计算机,则用户在退出屏幕保护程序后会出现空白屏幕,并且必须显式 ctrl+alt+delete 才能登录。发生这种情况是因为后台进程正在 WinLogon 的桌面下运行,Windows 再次等待屏幕保护程序退出。

有没有办法解决这个问题?我能想到的最好的事情是找到某种方法来强制后台进程作为 explorer.exe 的子进程而不是屏幕保护程序本身运行,但我不确定这样做的最佳方法是什么,或者如果可能的话。我已经尝试使用各种参数 p/调用 Win32 API 的 CreateProcess 方法,但也没有成功。

【问题讨论】:

  • STARTUPINFO.lpDesktop 成员很重要。您的安装人员只需启动该过程就会容易得多。
  • 这是最初的想法。不幸的是,这可能是通过 WMI 远程安装的,因此不会在当前用户的上下文或他们的桌面上启动进程。
  • 尝试给他们发送一封带有链接的电子邮件。

标签: .net process screensaver


【解决方案1】:

作为一种简单的解决方法,您可以将后台进程的运行与屏幕保护程序的运行联系起来 - 如果屏幕保护程序需要启动支持进程,则让它也负责关闭该进程。然后,在第一次重新启动之前,您将拥有一些可以工作的东西,尽管功能有所减少。

或者,作为一种更复杂的解决方案,鉴于一个进程可以使用不同的凭据启动另一个进程,您应该能够创建一个 Windows 服务,该服务负责使用适当的凭据启动后台进程,这是一种确保实际的后台进程正在运行。

【讨论】:

  • 我们几个月前就解决了这个问题,但第二种选择几乎就是我们采用的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 2015-08-29
相关资源
最近更新 更多