Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Замена/выгрузка Shella (Explorer.exe)


Автор: SeregaLBN 16.2.2006, 16:20
Прога работает в полноэкранном режиме 24 час в сутки, и по сути explorer.exe ненужен.
Поэтому возникли пару вопросов:
1. Как можно при загрузке компа стартовать прогу вместо explorer.exe?
Или этот же вопрос только заданный по другому.
Можно ли загружать Windows2K или XP без загрузки explorer.exe?

2. При выходе из полноэкранного режима я запускаю explorer.exe, если его ещё нет.
А при входе в полноэкранный режим нужно выгрузить explorer.exe.
Вопрос. Как можно _корректно_ закрыть explorer.exe?
Я делаю это так:
Код

   HWND hWndExlorer = ::FindWindow(_T("Progman"), _T("Program Manager"));
   ::PostMessage(hWndExlorer, WM_CLOSE, 0, 0);

Ну и в результате появляется стандартное обще_системно_модальное окно "Завершение работы Windows".
Я знаю, что если в этом окне нажать одновремённо <Shift>+<Ctrl>+<Alt>+<кликнуть мышкой по кнопке 'Отмена'>
то explorer.exe сам завершится. Я это пытался сэмулировать так:
Код

   /* просмотрел все главные и дочерние окна explorer.exe (EnumThreadWindows + EnumChildWindows):
   
   Process 'explorer.exe'
   ====================================
   Thread ID 0x0000060C
      ------------------------------------
      hWnd 0x000304EA, class [#32770], title [Завершение работы Windows]; parent 0x000604D0, parent class [DimmedWindowClass], parent title []
         hWnd 0x000304EC, class [Static], title []
         hWnd 0x000404E4, class [Static], title [&Выберите желаемое действие.]
         hWnd 0x000804CE, class [ComboBox], title []
         hWnd 0x0008049C, class [Static], title [Завершение сеанса пользователя, завершение работы Windows, а затем новый запуск Windows.]
         hWnd 0x000504D2, class [Button], title [&Запланированная остановка]
         hWnd 0x000704A4, class [Static], title [&Причина:]
         hWnd 0x000604E6, class [ComboBox], title []
         hWnd 0x00030500, class [Static], title []
         hWnd 0x000304F0, class [Static], title [&Комментарий:]
         hWnd 0x000304F4, class [Edit], title []
         hWnd 0x000304F6, class [Static], title [Выберите наиболее точное описание причины, по которой вы хотите завершить работу компьютера]
         hWnd 0x000304F8, class [Button], title [Регистрация событий завершения работы]
         hWnd 0x000304FA, class [Button], title [ОК]
         hWnd 0x000304F2, class [Button], title [Отмена]
         hWnd 0x000304FC, class [Button], title [&Справка]
      ------------------------------------
      hWnd 0x000604D0, class [DimmedWindowClass], title []; parent 0x00000000, parent class [], parent title []
      ------------------------------------

     Видно, что "Завершение работы Windows" является стандартным диалогом (класс окна #32770) родитель которого - DimmedWindowClass.
     Хотя поиск дочерних окон у DimmedWindowClass ничего не дал...
     Причём заметил, что DimmedWindowClass есть только тогда, когда есть окно "Завершение работы Windows".

     Поэтому, я запускаю таймер который работает до тех пор, пока не найдётся DimmedWindowClass.
     А когда находится нахожу модальный диалог которому и посылаю эмуляцию клавиш+клика.
   /**/
   // 1. Ищу родителя и нахожу.
   HWND hWnd = ::FindWindowEx(NULL, NULL, _T("DimmedWindowClass"), NULL);
   if (hWnd) {
      // 2. Ищу модальный диалог "Завершение работы Windows"
      hWnd = ::FindWindowEx(hWnd, NULL, _T("#32770"), NULL);

      // Ну и ненахожу. Ошибка ERROR_INVALID_WINDOW_HANDLE

      // 3. Поэтому ищу по-другому:
      hWnd = ::GetForegroundWindow();

      if (hWnd) {
         keybd_event(VK_SHIFT, 0, 0, 0);
         keybd_event(VK_MENU, 0, 0, 0);
         keybd_event(VK_CONTROL, 0, 0, 0);
         ::PostMessage(hWnd, WM_COMMAND, MAKEWPARAM(IDCANCEL, BN_CLICKED), 0);    
         keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
         keybd_event(VK_MENU, 0, KEYEVENTF_KEYUP, 0);
         keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
      }
   }

Это всё у меня работает. Но хочется по-другому и попроще выгружать explorer.exe...

3. Как при загрузке explorer.exe отменить загрузку программ, что указаны в Start->Progarmm->AutoRun?
У меня пока только одна идея - переименовывать во время запуска этот каталог.

Автор: Fixin 16.2.2006, 16:31
http://forum.vingrad.ru/index.php?showtopic=82128&view=findpost&p=635037

Автор: SeregaLBN 16.2.2006, 17:26
Цитата(Fixin @ 16.2.2006, 16:31 Найти цитируемый пост)
Смотри тут, может поможет

Спасибо за ссылку

Там пишут:
Цитата(rsm @ 2.2.2006, 17:25 Найти цитируемый пост)
"HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" в значении параметра "Shell" пропиши путь к файлу который собираешься запускать.


Но у меня его нет. А есть на НKLM

Автор: oleg1973 16.2.2006, 17:51
НKCU=HKEY_CURRENT_USER

Автор: SeregaLBN 16.2.2006, 18:06
Цитата(oleg1973 @ 16.2.2006, 17:51 Найти цитируемый пост)
НKCU=HKEY_CURRENT_USER

Сорри, ошибся.
Подправил своё сообщение.

Проверил это дело. Создал в НKCU (не меняя в НKLM) параметра "Shell"="MyProg.exe"
Загрузилось smile То что надо!

Автор: SeregaLBN 17.2.2006, 14:39
Доделал ещё следующее - если не получилось корректно выйти из explorer.exe я его прибиваю:
Код

   DWORD dwExplorerProcessID = ProcessID(_T("explorer.exe"));
   if (dwExplorerProcessID) {
      HANDLE hExplorerProcess = ::OpenProcess(PROCESS_TERMINATE, FALSE, dwExplorerProcessID);
      if (hExplorerProcess) {
         ::TerminateProcess(hExplorerProcess, 1234);
      }
   }

Он то убивается, но через пару секунд заного загружается. smile
Помотрел кто его загружает - сервис lsass.exe - Local Security Authority Service
Как мне обойти эту траблу? Не хочется как то убивать ещё и этот сервис.

Автор: DigitSphinx 24.6.2007, 09:44
Цитата(SeregaLBN @  17.2.2006,  15:39 Найти цитируемый пост)
Он то убивается, но через пару секунд заного загружается

Уже не актуально, но если кто по поиску найдет эту тему то ….  smile 
Это стандартная настройка винды что explorer запускается через пару секунд.
Я не знаю где в реестре можно поменять но есть такая прога Power Pack и в ней можно снять галочку  
System optimizer -> windows -> miscellaneous -> automatically restart Explorer

Автор: jonie 24.6.2007, 18:16
Цитата

Я не знаю где в реестре можно поменять но есть такая прога Power Pack и в ней можно снять галочку  
System optimizer -> windows -> miscellaneous -> automatically restart Explorer
я пологаю в gpedit.msc легально менять эксплорер на любую другую оболочку.

Автор: dumb 25.6.2007, 01:30
решение было уже: http://forum.vingrad.ru/index.php?showtopic=124611&view=findpost&p=945786

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)