Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Ручной запуск Explorer'а, а также и его выключение. [ XP / 7 ]  (Прочитано 14792 раз)
0 Пользователей и 1 Гость смотрят эту тему.
malor
Опытный

ru
Offline Offline

« : 07-11-2011 07:48 » 

Задача по запуску Explorer'а из своей программы (прописанной в параметре Shell реестра).


Имеем:
Код: (Delphi)
procedure TFormRunExplorer.btRunExplorerClick(Sender: TObject);
var
  FileName : String;
  SUInfo : TStartUpInfo;
  ProcInfo : TProcessInformation;
begin
  //ShellExecute(Handle, 'open', 'explorer.exe', 'C:\Windows\system32', '', SW_SHOW);
  //WinExec(PANsiChar('TASKKILL /F /IM explorer.exe'), SW_HIDE);
  //sleep(5000);
  //ShellExecute(Handle,'open','C:\WINDOWS\Explorer.EXE',nil,nil,SW_ShowNormal);

  ZeroMemory(@SUInfo, SizeOf(TStartUpInfo));
  with SUInfo do
  begin
   cb := SizeOf(TStartUpInfo);
   dwFlags := STARTF_USESHOWWINDOW;
   wShowWindow := SW_SHOWNORMAL;
  end;

  FileName := 'Explorer.exe';
  CreateProcess(PChar('C:\\Windows\\' + FileName), nil, nil, nil, False, 0, nil, nil, SUInfo, ProcInfo);
end;

Почему в результате имеем проводник, а не истинный рабочий стол с Панелью задач/Треем и прочим?

P.S. Обзор по Explorer'у:
1. Запуск explorer.exe
2. EXPLORER.EXE - Строковые параметры
3. Блокировка виндовс (Windows) с помощью Delphi

Windows XP SP3 / Win7 Ultimate
Записан
zubr
Гость
« Ответ #1 : 07-11-2011 09:27 » 

Сначала надо уже работающий процесс explorer.exe убить.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  id: Integer;
  hPr: cardinal;
begin
  id := StrToInt(Edit1.Text);
  hPr := OpenProcess(PROCESS_TERMINATE, False, id);
  TerminateProcess(hPr, 1);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  ShellExecute(0, 'open', 'explorer.exe', nil, nil, SW_SHOWNORMAL);
end;
Записан
malor
Опытный

ru
Offline Offline

« Ответ #2 : 07-11-2011 11:35 » 

Чтоб в переменную id положить значение я с помощью какой функции его найду ?
Записан
zubr
Гость
« Ответ #3 : 07-11-2011 13:08 » 

CreateToolhelp32Snapshot, Process32First, Process32Next пока не найдешь процесс с именем explorer.exe
Записан
malor
Опытный

ru
Offline Offline

« Ответ #4 : 08-11-2011 06:22 » 

Взял код из поста Исходник завершения процесса. Немного урезал:
Код: (Delphi)
const TerminateName = 'explorer.exe';

function FindExplorer(): boolean;
var
  FSnapshotHandle, ProcessHandle: THandle;
  FProcessEntry32: TProcessEntry32;
  S : String;
begin

  Result := True;
  FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
  Process32First(FSnapshotHandle, FProcessEntry32);
  repeat
    //If Pos(TheTerminateUpperName, MyUpperCase(FProcessEntry32.szExeFile)) > 0 then
    //S := UpperCase(FProcessEntry32.szExeFile);
    If (FProcessEntry32.szExeFile = TerminateName) then
    Begin
      //ShowMessage('Найден explorer.exe!');
      ProcessHandle := OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID);
      if ProcessHandle <> 0 then
        begin
          Result := Result and  TerminateProcess(ProcessHandle, 0);
          if (not Result) then
            MessageBox(0, Pchar(SysErrorMessage(GetLastError)), 'Error1', 0);
          CloseHandle(ProcessHandle);

        end
        else
          //MessageBox(0, Pchar(SysErrorMessage(GetLastError)), 'Error2', 0);
  End;
  Until not Process32Next(FSnapshotHandle, FProcessEntry32);

  CloseHandle(FSnapshotHandle);

end;


procedure TFormRunExplorer.btKillExplorerClick(Sender: TObject);
var
  id: Integer;
  hPr: cardinal;
begin
  // Уничтожить Explorer
  //id := StrToInt(Edit1.Text);
  //hPr := OpenProcess(PROCESS_TERMINATE, False, id);
  //TerminateProcess(hPr, 1);
  FindExplorer();
end;

Так вот по нажатию на кнопку Explorer уничтожается на несколько секунд, а затем снова появляется. В результате чего ?

P.S. По теме:
OpenProcess не возвращает дескриптор
Получение списка процессов с помощью Tool Help
Список процессов с путями, Windows Seven! 64-bit
Получить путь к EXE по дескриптору окна
Как получить хэндлы всех пpоцессов, котоpые запущены на данный момент в системе
Отслеживание процесса
Получение информации о выполняющихся процессах.

* RunExplorerProject.zip (85.46 Кб - загружено 812 раз.)
« Последнее редактирование: 08-11-2011 06:25 от malor » Записан
zubr
Гость
« Ответ #5 : 08-11-2011 06:54 » 

Потому что в TerminateProcess параметр exitcode = 0, а надо 1. Я ж тебе привел пример.
Записан
malor
Опытный

ru
Offline Offline

« Ответ #6 : 08-11-2011 12:06 » new

Explorer выгружается. Но, например, если у меня были открыты проги какие-то, то они остаются перед глазами. Как чтоб они тоже закрылись одновременно заодно  с explorer.exe сделать ?
Записан
zubr
Гость
« Ответ #7 : 08-11-2011 12:12 » 

Их тоже убить.
Записан
v2
Помогающий

ua
Offline Offline

« Ответ #8 : 08-11-2011 12:32 » 

TASKKILL /F /IM explorer* /T
Записан
malor
Опытный

ru
Offline Offline

« Ответ #9 : 08-11-2011 14:20 » 

Вместо функции
FindExplorer();
написал:
WinExec('TaskKill /F /IM explorer* /T', SW_HIDE);
и да, Explorer'a не стало.

Но тогда к чему был весь предыдущий код нужен?..  Меня одолевают смутные сомнения

========================================================

Прописал свою программу в параметре Shell реестра. Когда она запустилась - нажал кнопку Убить Explorer. Затем по нажатию на Запуск Explorer произойдет открытие Проводника. Это Windows 7 32-bit.
Почему ?
« Последнее редактирование: 08-11-2011 16:00 от malor » Записан
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #10 : 14-11-2011 23:45 » 

эксплорер - это и есть проводник. когда он запускается в качестве шелла, он стартует дополнительные окна, ТаскБар, например - это обычное окно, хозяин (owner) которого - эксплорер. когда ты тупо запускаешь эксплорер как прогу - он тупо запускается без всяких выкрутасов. этого его примечательное свойство используют как вирусы ("блокирующие" экран и требующие перечислить бабло на телефон за разблокировку), так и менеджеры типа Aston и др.
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines