Определение того, выполняется ли explorer.exe как оболочка Windows?
-
05-09-2019 - |
Вопрос
Мне нужно убедиться, что 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 должно быть достаточно для ваших нужд.