Как узнать, полностью ли рабочий стол Windows (загружен) С#

Я пишу приложение, которое запускается при входе в систему Windows, но я хочу, чтобы оно ждало, пока рабочий стол полностью загрузится/загрузится, прежде чем оно действительно начнет что-либо делать. Есть ли способ решить, когда Windows полностью закончила загрузку рабочего стола?


person PentaPenguin    schedule 01.08.2009    source источник


Ответы (5)


В Vista вы можете использовать службу в автоматическом (отложенном) режиме, она будет запускаться до входа в систему, если никто не вошел в систему достаточно быстро, но если вы хотите избежать запуска до тех пор, пока большая часть системы не будет готова, это сработает. Если вы сильно ориентированы на пользователя в своем желании дождаться, пока они будут готовы, вам, вероятно, придется использовать ориентированные на пользователя триггеры.

Существует несколько метрик, которые дадут вам хорошее представление о том, считает ли пользователь сеанс готовым к использованию:

  • Загрузка ЦП процессов, связанных с системной учетной записью, больше не занимала значительную часть времени ЦП.
  • Пользователь начал взаимодействовать с пользовательским интерфейсом (значительное движение мыши или клавиатура).
  • подключение к сети установлено

Поскольку это эвристика, у вас должны быть некоторые временные ограничения для минимального и максимального возможного ожидания в случае, если они не сработают.

person ShuggyCoUk    schedule 01.08.2009
comment
Спасибо, это то, что я искал. Я думаю, что счетчики производительности могут быть местом, с которого можно начать поиск в этом плане. Система автоматизирована, поэтому пользователь не будет контролировать взаимодействие с пользователем, но должны быть другие вещи, которые дают хорошее указание на то, что она закончила свою работу. Будет копать. - person PentaPenguin; 02.08.2009
comment
Ataris22 - мне все равно было бы интересно узнать, какого конечного эффекта вы хотите достичь, например. что будет делать ваше приложение, чтобы вы хотели, чтобы оно загружалось поздно (последним) в процессе запуска? - person Matthew; 06.08.2009
comment
@ShuggyCoUK Я сталкиваюсь с похожей ситуацией, с той разницей, что я хочу убедиться, что рабочий стол готов во время быстрого переключения пользователей (например, войдите в Windows 8.1, перейдите к переключению пользователя, затем переключитесь обратно на того же пользователя, рабочий стол начинает мерцать до того, как все устроится). Как я узнаю, что в это время все загружается на рабочий стол? - person aalimian; 05.11.2014

Очень старый вопрос, но мне нужно было то же самое. Кажется, работает следующий код:

        [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);
person Tom Wagener    schedule 15.01.2014
comment
Это деньги. На самом деле у меня произошел сбой в моем приложении, который произошел при первом входе в систему, когда рабочий стол загружался до 5 минут, пока он готовит среду пользователя. Я также обращался к системному трею, так что это действительно помогает ждать, пока чертова штука не будет готова. - person Ultratrunks; 08.05.2014

Я предполагаю, что вы в первую очередь имеете в виду интерактивные приложения на основе пользовательского интерфейса, а не системные службы.

Невозможно узнать, когда другие приложения закончили загрузку, поскольку определение «завершено» не является четким. Однако вы можете управлять порядком запуска приложений с помощью сторонней утилиты, такой как http://www.chameleon-managers.com/windows-startup-manager/startup-delayer.php.

Мне любопытно понять, какого эффекта вы пытаетесь достичь, запуская свое приложение только после завершения загрузки других настольных приложений. Знание этого может помочь предложить альтернативные ответы.

С уважением

person Matthew    schedule 01.08.2009

При загрузке вашего приложения вы не могли бы войти в цикл таймера и подождать, пока все ваши необходимые процессы будут загружены, отслеживая список процессов. Как только условия будут выполнены, вы можете продолжить инициализацию приложения.

Process[] apps  =   Process.GetProcesses();
person Brad    schedule 01.08.2009
comment
Вы делаете хорошее замечание - если вы явно знаете, чего ждете, вы можете кодировать это. - person Matthew; 02.08.2009

Просто установите приложение в папку автозагрузки< /а>. Также загляните на страницу википедии, посвященную запуску. Чтобы установить приложение C# в папку автозагрузки прочитайте это.

person Kredns    schedule 01.08.2009
comment
Запуск приложения не является проблемой. Это гарантирует, что все остальное будет загружено и выполнено до того, как я действительно начну выполнять какую-либо работу в своем приложении. Я думал о том, чтобы отслеживать активность процессора, но это не очень хороший способ сделать это. - person PentaPenguin; 02.08.2009
comment
@Ataris22: Мониторинг активности процессора не работает, потому что некоторые старые системы всегда работают с загрузкой примерно 80%-100%. Последняя ссылка объясняет, как делать то, что вы хотите. - person Kredns; 02.08.2009
comment
Опять же, это не запуск приложения, с которым я борюсь. Приложение уже использует ключ реестра, упомянутый в приведенной выше ссылке. Вопрос заключается в том, как лучше всего сказать, что рабочий стол Windows находится в полностью функциональном состоянии (а не в том, что настройка его запуска при запуске будет достигнута сама по себе) - person PentaPenguin; 02.08.2009
comment
Пожалуйста, уточните ваше определение полностью функционального. По каким критериям вы бы это определили? - person Matthew; 02.08.2009
comment
Ага, это был тот самый вопрос. Я понимаю, что это довольно неудобный вопрос. Спасибо за каждый вклад. - person PentaPenguin; 02.08.2009