Windowsデスクトップが完全に機能(ロード)されているかどうかを確認する方法C#
質問
Windowsログオンで実行するアプリケーションを作成していますが、実際に何かを開始する前にデスクトップが完全に機能/ロードされるまで待機するようにします。 Windowsがデスクトップの読み込みを完全に終了したときに解決する方法はありますか?
解決
Vistaでは、自動(遅延)モードでサービスを使用できますが、誰も十分に速くログオンしていない場合はログオン前に開始しますが、システムの多くが準備ができるまで実行を避けたい場合はこれが機能します。準備が整うまで待機したいというユーザー志向が強い場合は、おそらくユーザー中心のトリガーを使用する必要があります。
ユーザーがセッションを使用する準備ができているとユーザーが判断したかどうかを判断するいくつかのメトリックが存在します:
- システムアカウントに関連付けられたプロセスのCPU負荷は、CPU時間の大部分を占めていません。
- ユーザーはUIとの対話を開始しました(マウスの大幅な移動またはキーボード操作)
- ネットワーク接続が確立されました
これらはヒューリスティックであるため、失火した場合の最小および最大待機時間には時間ベースの制約が必要です。
他のヒント
非常に古い質問ですが、同じものが必要でした。次のコードは動作しているようです:
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
// wait until desktop ready
IntPtr lHwnd = IntPtr.Zero;
do
{
lHwnd = FindWindow("Shell_TrayWnd", null);
Thread.Sleep(100);
} while (lHwnd == IntPtr.Zero);
あなたは主にシステムサービスではなく、インタラクティブなUIベースのアプリを指していると思います。
" finished"の定義により、他のアプリケーションがいつロードを終了したかを知る方法はありません。明確ではありません。ただし、 http://www.chameleon-managers.com/windows-startup-manager/startup-delayer.php 。
他のデスクトップアプリケーションの読み込みが完了した後にのみアプリケーションを実行することで達成しようとしている効果を理解したいと思います。これを知っていると、別の答えを提案するのに役立つかもしれません。
よろしく
アプリケーションのロード中に、タイマーループに入り、プロセスリストを監視してすべての前提プロセスがロードされるまで待機できませんでした。条件が満たされたら、アプリケーションの初期化を続行できます。
Process[] apps = Process.GetProcesses();
アプリケーションをにインストールするだけです。スタートアップフォルダ。 スタートアップのウィキペディアのページもご覧ください。スタートアップフォルダにC#アプリケーションをインストールするには、こちらを読む。