2

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

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

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

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

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

4

1 回答 1

2

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

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

于 2012-01-09T00:14:44.913 回答