Определение того, выполняется ли explorer.exe как оболочка Windows?

StackOverflow https://stackoverflow.com/questions/905131

Вопрос

Мне нужно убедиться, что explorer.exe запускается как системная оболочка.Что мне нужно сделать, это:

  • Перезаписать текущую оболочку (Winlogon\Shell) с explorer.exe
  • Беги explorer.exe (как оболочка)
  • Перезапишите текущую оболочку моей собственной оболочкой.

Между последними двумя шагами - гонка:

  • Если я слишком быстро перезапишу текущую оболочку своей собственной оболочкой, откроется только окно "Мои документы".

Итак, вопрос в том, есть ли какие-либо события / мьютексы / обратные вызовы, которые я могу вызвать, чтобы убедиться, что explorer инициализирован как shell?

Лучшее, что мне удалось сделать, это дождаться появления окна в трее, подобного:

while(!FindWindow("Shell_TrayWnd", NULL)) { 
     sleep(250);
}

Что кажется довольно неаккуратным, есть ли способ получше?

Это было полезно?

Решение

Я бы даже не пытался этого делать.Вы должны создать новый рабочий стол winsta0 (Win32 API CreateDesktop), запустить свое приложение Kiosk на этом рабочем столе и переключиться на него.Таким образом, вы оставляете в покое рабочий стол по умолчанию, запускаете Explorer и можете вернуться к нему, если вам нужно.Мы добились большого успеха в реализации этого проекта киоска, который мы построили.

Другие советы

Лучшим способом (как на самом деле задокументировано) было бы создать окно верхнего уровня и дождаться трансляции "TaskbarCreated".Таким образом, вы также избавитесь от вызова Sleep() .

Трансляция задокументирована здесь.

Вы не объяснили, зачем вам нужны 3 шага, "программное обеспечение киоска" - это не объяснение.

Вы пробовали просто установить оболочку в system.ini, например litestep и другое программное обеспечение для замены рабочего стола?Если вам нужно переключаться туда-сюда, то рассмотрите переключатель оболочки, например Шеллон или ЛитеСпаун которые были написаны для этой задачи.

Почему бы вам не понаблюдать за запущенными процессами?До шага 1 explorer.exe не должен быть указан, поскольку это не оболочка по умолчанию.Шаг 2 вы запускаете его и наблюдаете за процессом, который, как только он станет доступен, вы затем измените.

Я не уверен, используете ли вы .NET framework или нет, но если используете, событий в классах StartInfo должно быть достаточно для ваших нужд.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top