Я пишу приложение, которое запускается при входе в систему Windows, но я хочу, чтобы оно ждало, пока рабочий стол полностью загрузится/загрузится, прежде чем оно действительно начнет что-либо делать. Есть ли способ решить, когда Windows полностью закончила загрузку рабочего стола?
Как узнать, полностью ли рабочий стол Windows (загружен) С#
Ответы (5)
В Vista вы можете использовать службу в автоматическом (отложенном) режиме, она будет запускаться до входа в систему, если никто не вошел в систему достаточно быстро, но если вы хотите избежать запуска до тех пор, пока большая часть системы не будет готова, это сработает. Если вы сильно ориентированы на пользователя в своем желании дождаться, пока они будут готовы, вам, вероятно, придется использовать ориентированные на пользователя триггеры.
Существует несколько метрик, которые дадут вам хорошее представление о том, считает ли пользователь сеанс готовым к использованию:
- Загрузка ЦП процессов, связанных с системной учетной записью, больше не занимала значительную часть времени ЦП.
- Пользователь начал взаимодействовать с пользовательским интерфейсом (значительное движение мыши или клавиатура).
- подключение к сети установлено
Поскольку это эвристика, у вас должны быть некоторые временные ограничения для минимального и максимального возможного ожидания в случае, если они не сработают.
Очень старый вопрос, но мне нужно было то же самое. Кажется, работает следующий код:
[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);
Я предполагаю, что вы в первую очередь имеете в виду интерактивные приложения на основе пользовательского интерфейса, а не системные службы.
Невозможно узнать, когда другие приложения закончили загрузку, поскольку определение «завершено» не является четким. Однако вы можете управлять порядком запуска приложений с помощью сторонней утилиты, такой как http://www.chameleon-managers.com/windows-startup-manager/startup-delayer.php.
Мне любопытно понять, какого эффекта вы пытаетесь достичь, запуская свое приложение только после завершения загрузки других настольных приложений. Знание этого может помочь предложить альтернативные ответы.
С уважением
При загрузке вашего приложения вы не могли бы войти в цикл таймера и подождать, пока все ваши необходимые процессы будут загружены, отслеживая список процессов. Как только условия будут выполнены, вы можете продолжить инициализацию приложения.
Process[] apps = Process.GetProcesses();
Просто установите приложение в папку автозагрузки< /а>. Также загляните на страницу википедии, посвященную запуску. Чтобы установить приложение C# в папку автозагрузки прочитайте это.