2011-02-03 35 views
2

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

私が考えている最良の解決策は、スクリーンセーバーが起動したときにバックグラウンドプロセスが実行されているかどうかを検出し、そうでない場合は.NETのProcessクラスを使用するだけです。ただし、スクリーンセーバープロセスやスクリーンセーバーで作成された子プロセスがまだ実行中にスクリーンセーバーが実行されていると、Windowsは常に思っているようですが、これは2つの関連する問題に気付いています。

1)この結果、スクリーンセーバーは独自に起動し、プロセスを起動しますが、Windowsはバックグラウンドプロセスがまだ実行中であるため、最初のスクリーンセーバーがまだアクティブであると考えているため、再び開始されません。

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

これを回避する手段はありますか?私が考えることができる最も良いことは、スクリーンセーバーそのものの代わりにexplorer.exeの子としてバックグラウンドプロセスを強制的に実行させる何らかの方法を見つけることですが、それを実行する最善の方法が何であるか、またはもしそれが可能であれば。私は、Win32 APIのCreateProcessメソッドを呼び出すだけでなく、さまざまなパラメータを使用して成功/失敗を試みました。

+0

STARTUPINFO.lpデスクトップメンバーは重要です。あなたのインストーラがプロセスを開始するのはずっと簡単です。 –

+0

それは最初の考えでした。残念ながら、これはWMI経由でリモートにインストールできるため、現在のユーザーのコンテキストやデスクトップでプロセスを開始することはありません。 – MisterZimbu

+0

リンクをクリックしてメールを送信してください。 –

答えて

2

単純な回避策として、バックグラウンドプロセスの実行をスクリーンセーバーの実行に結びつけることができます。スクリーンセーバーがサポートプロセスを開始する必要がある場合は、そのプロセスもシャットダウンする必要があります。最初に再起動する前に、機能が低下していても動作するものを用意しておきましょう。

また、より複雑なソリューションとして、あるプロセスが別の資格情報で別のプロセスを開始する可能性がある場合、適切な資格情報を持つバックグラウンドプロセスを起動するWindowsサービスを作成できる必要があります。実際のバックグラウンドプロセスが実行中であることを確認してください。

+0

私たちはこの数ヶ月前に解決しましたが、第二の選択肢は私たちが取ったアプローチです。 – MisterZimbu

関連する問題