Windows XPを実行するいくつかのキオスクでは、かなり専門的なスクリーンセーバーアプリケーションを構築しています。何の最近の活動がなかったことをユーザに通知しWindows XPスクリーンセーバー - スクリーンセーバーでプロセスダイを公開
- を発表、そして:ユーザーは、スクリーンセーバーが次んので、ホームページにブラウザを返さずにキオスクを残す傾向にありますブラウザはX秒後に終了します。
- ユーザーアクティビティなしでX秒が経過すると、スクリーンセーバーは(Process.GetProcessesByNameを介して)現在のすべてのブラウザインスタンスを強制終了し、Process.Start経由で設定されたWebサイトを指し示すブラウザの新しいインスタンスを開始します。
- ユーザーがマウスを動かすかキーを押すまで画面が「空白」になります。この時点でスクリーンセーバーアプリケーションは終了します。
これをWindows Vistaまたは2008で実行すると、すべて正常に動作します。
しかし、Windows XP(キオスクが実行されている)では、スクリーンセーバーアプリケーションが終了すると、ブラウザプロセスが強制終了されます。スクリーンセーバーが存在する直前にThread.Sleepを追加すると、スクリーンセーバーが終了するまでブラウザを表示して操作することができます。
問題をより混乱させるために、設定領域で[プレビュー]ボタンをクリックしてスクリーンセーバーを実行すると、Windows XPはこの動作をしません。この場合、まったく同じコードが実行されます。
私はこれを.NET 2.0フレームワークでテストし、後で.NET 2.0 SP1をインストールしました。 Windows 2008ワークステーションでは、私は3.5 SP1を持っています。
起動したプロセスの依存性に関して、これらのバージョンの.NETにはいくつかの違いがありますか?起動されたブラウザプロセスがスクリーンセーバアプリケーションに「接続」されていないことを確認するために設定できるフラグはありますか?
私はあなたの2番目の提案(IPC)をしなければなりませんでした。私はそれを実装するために新しい(.NET 3.5への)NamedPipeServerStreamとNamedPipeClientStreamクラスを使用して終了し、うまくいきます。 最初に最初の提案を試みましたが、Windows XPが "ベルトとサスペンド"のルールに従っているように見えます。プロセスツリーを殺して別のデスクトップで実行するように見えます。実装が簡単です。 – user127665