我有一个用.NET / C#编写的屏幕保护程序,它依赖于正在运行的后台进程。虽然在安装时将后台进程添加到用户的启动程序中,但在安装屏幕保护程序后不要求用户重新启动计算机仍然是一件好事。该进程本身必须在当前用户的凭据下运行,因此使用Windows服务是不可能的。
我想到的最佳解决方案是在屏幕保护程序启动时检测后台进程是否正在运行,如果不是,则启动它,只使用.NET的Process类。但是,我注意到这两个有些相关的问题:
1)Windows似乎总是认为屏幕保护程序正在运行,而屏幕保护程序进程或屏幕保护程序创建的任何子进程仍在运行。最终结果是屏幕保护程序将自行启动并生成进程,但永远不会再启动,因为Windows认为第一个屏幕保护程序仍处于活动状态,因为后台进程仍在运行。
2)如果计算机设置为在屏幕保护程序弹出时锁定计算机,退出屏幕保护程序后用户将留下一个空白屏幕,并且必须显式按ctrl + alt + delete登录。这是因为后台进程在WinLogon的桌面下运行,Windows再次等待屏幕保护程序退出。
这有什么办法吗?我能想到的最好的事情是找到一些方法来强制后台进程作为explorer.exe的子代而不是屏幕保护程序本身运行,但我不确定最好的方法是做什么,或者如果它甚至可能。我尝试过调用Win32 API的CreateProcess方法以及各种参数也没有成功。
答案 0 :(得分:2)
作为一种简单的解决方法,您可以将后台进程的运行与屏幕保护程序的运行联系起来 - 如果屏幕保护程序需要启动支持进程,则还要负责关闭该进程。然后,在第一次重启之前,你会有一些可行的功能,虽然功能有所减少。
或者,作为一个更复杂的解决方案,考虑到一个进程可以使用不同的凭据启动另一个进程,您应该能够创建一个Windows服务,该服务负责使用适当的凭据启动后台进程,这种服务可以确保实际的后台进程正在运行。