バックグラウンドプロセスの実行に依存する.NET/C#で書かれたスクリーンセーバーがあります。バックグラウンドプロセスはインストール時にユーザーのスタートアッププログラムに追加されますが、スクリーンセーバーをインストールした後にユーザーがマシンを再起動する必要はありません。プロセス自体は現在のユーザーの資格情報の下で実行する必要があるため、これに対してWindowsサービスを使用することは問題になりません。スクリーンセーバーで子プロセスを起動する
私が考えている最良の解決策は、スクリーンセーバーが起動したときにバックグラウンドプロセスが実行されているかどうかを検出し、そうでない場合は.NETのProcessクラスを使用するだけです。ただし、スクリーンセーバープロセスやスクリーンセーバーで作成された子プロセスがまだ実行中にスクリーンセーバーが実行されていると、Windowsは常に思っているようですが、これは2つの関連する問題に気付いています。
1)この結果、スクリーンセーバーは独自に起動し、プロセスを起動しますが、Windowsはバックグラウンドプロセスがまだ実行中であるため、最初のスクリーンセーバーがまだアクティブであると考えているため、再び開始されません。
2)スクリーンセーバーがポップアップしたときにコンピュータをロックするように設定されている場合、スクリーンセーバーを終了した後に空白の画面が表示され、明示的にCtrl + Alt + Deleteキーを押してログインする必要があります。バックグラウンドプロセスはWinLogonのデスクトップで実行されているため、Windowsはスクリーンセーバーが終了するのを待っています。
これを回避する手段はありますか?私が考えることができる最も良いことは、スクリーンセーバーそのものの代わりにexplorer.exeの子としてバックグラウンドプロセスを強制的に実行させる何らかの方法を見つけることですが、それを実行する最善の方法が何であるか、またはもしそれが可能であれば。私は、Win32 APIのCreateProcessメソッドを呼び出すだけでなく、さまざまなパラメータを使用して成功/失敗を試みました。
STARTUPINFO.lpデスクトップメンバーは重要です。あなたのインストーラがプロセスを開始するのはずっと簡単です。 –
それは最初の考えでした。残念ながら、これはWMI経由でリモートにインストールできるため、現在のユーザーのコンテキストやデスクトップでプロセスを開始することはありません。 – MisterZimbu
リンクをクリックしてメールを送信してください。 –