2

バックグラウンド プロセスの実行に依存する .NET / C# で記述されたスクリーンセーバーがあります。インストール時にバックグラウンド プロセスがユーザーのスタートアップ プログラムに追加されますが、スクリーンセーバーのインストール後にユーザーがマシンを再起動する必要がないようにすると便利です。プロセス自体は現在のユーザーの資格情報の下で実行する必要があるため、これに Windows サービスを使用することは問題外です。

これについて私が考えた最善の解決策は、スクリーン セーバーの開始時にバックグラウンド プロセスが実行されているかどうかを検出し、実行されていない場合は.NET の Process クラスを使用して開始することです。ただし、これを行うと、多少関連する 2 つの問題があることに気付きました。

1) Windows は、スクリーンセーバー プロセス、またはスクリーンセーバーによって作成された子プロセスがまだ実行されている間、スクリーンセーバーが実行されていると常に考えているようです。これの最終的な結果は、スクリーンセーバーが独自に起動してプロセスを生成しますが、バックグラウンド プロセスがまだ実行されているため、最初のスクリーンセーバーがまだアクティブであると Windows が判断するため、再び起動することはありません。

2) スクリーンセーバーがポップアップしたときにコンピューターをロックするようにコンピューターが設定されている場合、ユーザーはスクリーンセーバーを終了した後に空白の画面が残り、明示的に ctrl+alt+delete を押してログインする必要があります。これは、バックグラウンド プロセスが原因で発生します。は WinLogon のデスクトップで実行されており、Windows はスクリーンセーバーが終了するのを待っています。

これを回避する方法はありますか?私が考えることができる最善の方法は、スクリーンセーバー自体ではなく、バックグラウンド プロセスを強制的に explorer.exe の子として実行する方法を見つけることですが、それを実行するための最良の方法が何であるかはわかりません。可能であれば。Win32 API の CreateProcess メソッドを p/invoking しようとしましたが、さまざまなパラメーターを使用しても成功しませんでした。

4

1 に答える 1

2

簡単な回避策として、バックグラウンドプロセスの実行をスクリーンセーバーの実行に関連付けることができます。スクリーンセーバーがサポートプロセスを開始する必要がある場合は、そのプロセスもシャットダウンする必要があります。そうすれば、最初の再起動の前に、機能は低下しますが、機能するものが得られます。

または、より複雑なソリューションとして、あるプロセスが異なるクレデンシャルで別のプロセスを開始できる場合、適切なクレデンシャルを使用してバックグラウンドプロセスを起動するWindowsサービスを作成できるはずです。これは、実際のバックグラウンドを確認するウォッチドッグサービスの一種です。プロセスが実行されています。

于 2012-01-09T00:14:44.913 に答える