バックグラウンド プロセスの実行に依存する .NET / C# で記述されたスクリーンセーバーがあります。インストール時にバックグラウンド プロセスがユーザーのスタートアップ プログラムに追加されますが、スクリーンセーバーのインストール後にユーザーがマシンを再起動する必要がないようにすると便利です。プロセス自体は現在のユーザーの資格情報の下で実行する必要があるため、これに Windows サービスを使用することは問題外です。
これについて私が考えた最善の解決策は、スクリーン セーバーの開始時にバックグラウンド プロセスが実行されているかどうかを検出し、実行されていない場合は.NET の Process クラスを使用して開始することです。ただし、これを行うと、多少関連する 2 つの問題があることに気付きました。
1) Windows は、スクリーンセーバー プロセス、またはスクリーンセーバーによって作成された子プロセスがまだ実行されている間、スクリーンセーバーが実行されていると常に考えているようです。これの最終的な結果は、スクリーンセーバーが独自に起動してプロセスを生成しますが、バックグラウンド プロセスがまだ実行されているため、最初のスクリーンセーバーがまだアクティブであると Windows が判断するため、再び起動することはありません。
2) スクリーンセーバーがポップアップしたときにコンピューターをロックするようにコンピューターが設定されている場合、ユーザーはスクリーンセーバーを終了した後に空白の画面が残り、明示的に ctrl+alt+delete を押してログインする必要があります。これは、バックグラウンド プロセスが原因で発生します。は WinLogon のデスクトップで実行されており、Windows はスクリーンセーバーが終了するのを待っています。
これを回避する方法はありますか?私が考えることができる最善の方法は、スクリーンセーバー自体ではなく、バックグラウンド プロセスを強制的に explorer.exe の子として実行する方法を見つけることですが、それを実行するための最良の方法が何であるかはわかりません。可能であれば。Win32 API の CreateProcess メソッドを p/invoking しようとしましたが、さまざまなパラメーターを使用しても成功しませんでした。