Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Как перезапустить Program Manager?


Автор: Rowi 7.1.2006, 21:29
Здравствуйте, все!

Подскажите, пожалуйста, после того, как программа "убила" Explorer:

Код
PostMessage(FindWindow(nil,'Program Manager'),WM_QUIT,1,0)


может ли она (программа) полностью восстановить всё, относящееся
к Explorer'у (кнопку Пуск, Панель задач и т.п.)
без перезагрузки компьютера?

Пытаюсь
Код
ShellExecute(0,'open','Explorer',nil,nil,SW_SHOWNORMAL)

но только открывается окно "Мои документы", а ничего
не восстанавливается smile .


Автор: SoWa 7.1.2006, 21:37
Странно. Должно нормально восстановиться. А посмотри в CAD, все Explorer убиты?

Автор: Poseidon 7.1.2006, 22:08
Если убит Explorer, то винда сама пытается восстановить его (так по дефолту по крайней мере)

Автор: FRAGNATIC 7.1.2006, 22:17
Цитата(Poseidon @ 7.1.2006, 22:08 Найти цитируемый пост)

Если убит Explorer, то винда сама пытается восстановить его (так по дефолту по крайней мере)

так от сервис пака зависит вроде)
хотя у меня так и не востовналивает если я сам его убью но если при какомлибо зависании он просто уходит в даун и отрубается то тогда винда его сама востонавливает
Цитата(Rowi @ 7.1.2006, 21:29 Найти цитируемый пост)

но только открывается окно "Мои документы", а ничего

такое происходит если эксплорэр не вырубился)
потому что если кильнуть процес самому и потомже через меню выполнить опятьже вызвать explorer.exe то всё востоналивает номано
попробую может
Winexec('Explorer.exe',0)


Автор: Rowi 8.1.2006, 01:37
Цитата(SoWa @ 7.1.2006, 21:37 Найти цитируемый пост)

А посмотри в CAD, все Explorer убиты?

Я дико извиняюсь, но что такое CAD? Если я правильно догадался - Диспетчер задач Windows?


Цитата(FRAGNATIC @ 7.1.2006, 22:17 Найти цитируемый пост)

Цитата(Poseidon @ 7.1.2006, 22:08 )
Если убит Explorer, то винда сама пытается восстановить его (так по дефолту по крайней мере)


так от сервис пака зависит вроде)
хотя у меня так и не востовналивает если я сам его убью но если при какомлибо зависании он просто уходит в даун и отрубается то тогда винда его сама востонавливает

Именно так у меня и происходит - ДОСЛОВНО!
(Кстати, у меня WinXP SP2)

Автор: FRAGNATIC 8.1.2006, 01:42
Цитата(Rowi @ 8.1.2006, 01:37 Найти цитируемый пост)

Я дико извиняюсь, но что такое CAD? Если я правильно догадался - Диспетчер задач Windows?

три клавишии
Ctrl +ALt+Delete
Добавлено @ 01:49
Rowi
а вообще оно так и будет работать как ты говоришь тока в том случаии если когда ты таким вот образом убивал эксплорэр было открыто какойнить окно провдника типа диск С или Д или какая-то папка! убивается сам эксплорэр но остаётся висеть это окно процес которого тоже ехсплорэр и когда ты пытаешся заново запустить эксплорэр он видет что такой процес уже есть и думает что это кокрас и есть тот эксплорэр который в себя включает пуск и тп , и поэтому запускает проводник=)
так что килить те надо не прсото окно Program Manager а сами процесы=)

Автор: Rowi 8.1.2006, 03:06
Ой... я, кажется, сам разобрался! smile
Похоже, я запутался в собственных экспериментах:

не получалось всё восстановить, если хэндл "жертвы" я получал так:
Код

  Wnd := FindWindow('Shell_TrayWnd', nil);
  Wnd := FindWindowEx(Wnd, HWND(0), 'Button', nil);

т.е. я убивал кнопку Пуск (собственно, сначала я к этому и стремился). При этом все "симптомы" те же, как и при убиении ProgMan'a. (Кстати, интересно - почему? И можно ли как-то восстановить в этом случае?)

Разница заметна только в Диспетчере задач (Ctrl +ALt+Delete): в этом случае в списке процессов explorer.exe остаётся! А насколько я знаю, если запускать второй (третий и т.д.) экземпляр explorer'a, то как раз и открывается только окно обзора.

А в случае того кода, что я приводил в начале - всё чудненько восстанавливается!
Так что ооочччень прошу меня извинить за ложную тревогу и за мою собственную рассеянность...

Автор: Albinos_x 8.1.2006, 04:02
Цитата(Rowi @ 8.1.2006, 03:06 Найти цитируемый пост)

т.е. я убивал кнопку Пуск (собственно, сначала я к этому и стремился).

Код

 // Скрывает (вариант 1)  
  procedure TForm1.Button1Click(Sender: TObject);  
  var Rgn:hRgn;  
  begin  
  Rgn:=CreateRectRgn(0,0,0,0);  
  SetWindowRgn(FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'Button',nil),Rgn,true);  
  end;  
  
 // Показывает (вариант 1)  
  procedure TForm1.Button2Click(Sender: TObject);  
  begin  
  SetWindowRgn(FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'Button',nil),0,true);  
  end;  
  
 // Скрывает (вариант2)  
  procedure TForm1.Button5Click(Sender: TObject);  
  begin  
  ShowWindow(GetWindow(FindWindow('Shell_TrayWnd',nil),GW_CHILD),SW_HIDE);  
  end;  
  
 // Показывает (вариант2)  
  procedure TForm1.Button6Click(Sender: TObject);  
  begin  
  ShowWindow(GetWindow(FindWindow('Shell_TrayWnd',nil),GW_CHILD),SW_NORMAL);  
  end;  
  
 // Делает недоступной  
  procedure TForm1.Button3Click(Sender: TObject);  
  begin  
  EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'Button',nil),false);  
  end;  
  
 // Снова доступна  
  procedure TForm1.Button4Click(Sender: TObject);  
  begin  
  EnableWindow(FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'Button',nil),true);  
  end;  
   ...  
  //Коментарий: Клавиша Windows срабатывает во всех вариантах               ///////////////////////////////////


Автор: bartram 8.1.2006, 11:22
Rowi, так Пуск является "сoбственностью" Explorer и поэтому когда ты убиваешь пуск, убивается и панель задач (визуально) а сам процесс Explorer.exe остается висеть в памяти, для скрытия кнопки Пуск юзай методы которые показал Albinos_x

Автор: Rowi 8.1.2006, 11:25
Цитата(Albinos_x @ 8.1.2006, 04:02 Найти цитируемый пост)

//Коментарий: Клавиша Windows срабатывает во всех вариантах

Как раз это меня и не устраивало (я ранее пробовал эти варианты), а плюс ещё и <Ctrl+Esc>!
Поэтому и пришёл к необходимости убивать либо кнопку "Пуск", либо весь Explorer. С Hook'ами связываться почему-то не хотелось.

Автор: Rowi 8.1.2006, 11:45
Цитата(Rowi @ 8.1.2006, 03:06 Найти цитируемый пост)

все "симптомы" те же, как и при убиении ProgMan'a.

Продолжая свои эксперименты, я таки заметил небольшую разницу:
  • Когда убивается только кнопка, при сворачивании разных рабочих окон они "складываются" внизу наподобие, как ChildForm в MDI. При этом, естественно, легче с ними работать.
  • А когда убивается весь Explorer, то эти окна при сворачивании просто "исчезают", и достать их можно только по <Alt+Tab>, что соответственно, не так удобно.
Поэтому первый вариант всё-таки чуть лучше.

И вроде уже придумал, как тут быть (правда, "из Москвы в Питер через Магадан" smile ):
Я сначала убиваю только кнопку, а когда потом надо всё восстановить, то сперва "добиваю" весь Explorer, а только потом его запускаю по новой. Несколько морочливо, но работает!

P.S. Проблема вроде как решена (всем огромное спасибо за отзывчивость!), но если кто-нибудь всё же наведёт на мысль, как "в Питер напрямую попасть smile ", то это уже будет решение на 100%!
Только из-за этой надежды пока не пометил вопрос, как "решённый"...

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