Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2009, 17:57   #1
bebecap
Пользователь
 
Регистрация: 11.09.2009
Сообщений: 20
По умолчанию Включение explorer'a с помощью Delphi 2009

Всем привет. У меня возникла проблема, мне надо, чтобы когда пользователь включал мою программу експлорер отрубался, а когда выключал обратно включался. Если можно предоставьте включение и выключение експлорера.
bebecap вне форума Ответить с цитированием
Старый 13.09.2009, 09:32   #2
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

Через FindWindow находишь - закрываешь. Через CreateProcess - запускаешь.
Д'якон вне форума Ответить с цитированием
Старый 05.10.2009, 15:50   #3
abyss_by
Пользователь
 
Аватар для abyss_by
 
Регистрация: 24.03.2009
Сообщений: 12
По умолчанию

Если автор имел ввиду не закрытие, а остановку Эксполера, то вот полностью рабочий код. Сначала каждой нити Эксполрера присваивается SuspendThread, затем, когда нужно, ResumeThread. Особенности Delphi 2009 в примере реализации функций учтены (явное указание AnsiString и MessageBoxA). Сами же функции в доработке, думаю, не нуждаются.

Код:
Program StopExplorer;

 Uses Windows, TlHelp32;

 var
  ProcStr: AnsiString;
  ProcID: DWord;

const
  THREAD_SUSPEND_RESUME  = $00000002;

function GetProcessPidByName(fName: String): THandle;

   function ProcessPidByName(hProcess: DWord; fName: String): THandle;
    var
     ProcEntry: TProcessEntry32;
     ProcessPid: THandle;
   begin
     ProcEntry.dwSize:= SizeOf(ProcEntry);
     ProcessPid:= 0;
     if Process32First(hProcess, ProcEntry) then
      begin
        repeat if ProcEntry.szExeFile = fName then
         begin
          ProcessPid:= ProcEntry.th32ProcessID;
          Result:= ProcessPid;
          Exit;
         end;
        until not Process32Next(hProcess, ProcEntry)
        end;
       Result:= ProcessPid;
   end;

 var
  hSnapshot: THandle;

begin
  hSnapshot:= CreateToolhelp32Snapshot($2, 0);
   if hSnapshot <> INVALID_HANDLE_VALUE then
    Result:= ProcessPidByName(hSnapshot, fName);
   CloseHandle (hSnapShot);
end;


Function OpenThread(dwDesiredAccess: dword;
                    bInheritHandle: bool;
                    dwThreadId: dword): dword; stdcall;
                                  external 'kernel32.dll';

{ Взято из  Advanced API Hook Libary. Coded By Ms-Rem ( Ms-Rem@yandex.ru )}

{ Остановка всех нитей процесса.
 Если останавливается текущий процесс, то вызывающая нить не останавливается.}
Function StopProcess(ProcessId: dword): boolean;
var
 Snap: dword;
 CurrTh: dword;
 ThrHandle: dword;
 Thread:TThreadEntry32;
begin
  Result := false;
  CurrTh := GetCurrentThreadId;
  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
  if Snap <> INVALID_HANDLE_VALUE then
     begin
     Thread.dwSize := SizeOf(TThreadEntry32);
     if Thread32First(Snap, Thread) then
     repeat
     if (Thread.th32ThreadID <> CurrTh) and (Thread.th32OwnerProcessID = ProcessId) then
        begin
        ThrHandle := OpenThread(THREAD_SUSPEND_RESUME, false, Thread.th32ThreadID);
        if ThrHandle = 0 then Exit;
        SuspendThread(ThrHandle);
        CloseHandle(ThrHandle);
        end;
     until not Thread32Next(Snap, Thread);
     CloseHandle(Snap);
     Result := true;
     end;
end;

{ Запуск процесса остановленного StopProcess }
Function RunProcess(ProcessId: dword): boolean;
var
 Snap: dword;
 CurrTh: dword;
 ThrHandle: dword;
 Thread:TThreadEntry32;
begin
  Result := false;
  CurrTh := GetCurrentThreadId;
  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
  if Snap <> INVALID_HANDLE_VALUE then
     begin
     Thread.dwSize := SizeOf(TThreadEntry32);
     if Thread32First(Snap, Thread) then
     repeat
     if (Thread.th32ThreadID <> CurrTh) and (Thread.th32OwnerProcessID = ProcessId) then
        begin
        ThrHandle := OpenThread(THREAD_SUSPEND_RESUME, false, Thread.th32ThreadID);
        if ThrHandle = 0 then Exit;
        ResumeThread(ThrHandle);
        CloseHandle(ThrHandle);
        end;
     until not Thread32Next(Snap, Thread);
     CloseHandle(Snap);
     Result := true;
     end;
end;

begin
  ProcStr:= 'explorer.exe';
  ProcID:= GetProcessPidByName(ProcStr);

 if StopProcess(ProcID) then
   begin
    SleepEx(5000, True);{5 секунд ждем}

    if RunProcess(ProcID) then
     MessageBoxA(0,PChar('Процесс ' + ProcStr+ ' восстановлен!'),
                 'Восстановление процесса',
                  MB_OK or MB_ICONASTERISK or MB_SYSTEMMODAL or MB_MODEMASK);
  end;

end.
abyss_by вне форума Ответить с цитированием
Старый 05.10.2009, 19:47   #4
lennon
Заблокирован
 
Регистрация: 18.11.2007
Сообщений: 254
По умолчанию

abyss_by ты сильно нахимичил : ) склоняюсь к первому варианту!
lennon вне форума Ответить с цитированием
Старый 06.10.2009, 20:29   #5
abyss_by
Пользователь
 
Аватар для abyss_by
 
Регистрация: 24.03.2009
Сообщений: 12
По умолчанию

lennon Видимо ты прав. Не правильно истолковал включить-выключить, наверное.
Вопрос, раз уж тема затронута. Как красиво перезапустить explorer под Vista и 7-кой? Здесь он закрывается, со всеми вытекающими, но процесс остаётся, т.е. если потом создать новый, то будет два! explorer-a. Приходится добивать старый процесс.
abyss_by вне форума Ответить с цитированием
Старый 09.10.2009, 22:23   #6
uberchel
Участник клуба
 
Аватар для uberchel
 
Регистрация: 19.01.2009
Сообщений: 1,453
По умолчанию

Цитата:
Сообщение от abyss_by Посмотреть сообщение
lennon Видимо ты прав. Не правильно истолковал включить-выключить, наверное.
Вопрос, раз уж тема затронута. Как красиво перезапустить explorer под Vista и 7-кой? Здесь он закрывается, со всеми вытекающими, но процесс остаётся, т.е. если потом создать новый, то будет два! explorer-a. Приходится добивать старый процесс.
Не знаю как в 7 а в остальных самый быстрый способ отк Explorer

Код:
WinExec('taskkill /F /IM explorer.exe'0);
uberchel вне форума Ответить с цитированием
Старый 10.10.2009, 20:07   #7
abyss_by
Пользователь
 
Аватар для abyss_by
 
Регистрация: 24.03.2009
Сообщений: 12
По умолчанию

Цитата:
Сообщение от uberchel Посмотреть сообщение
Код:
WinExec('taskkill /F /IM explorer.exe'0);
Без параметра /F не совсем то, что надо В 7-ке, на Висте не проверял.
А так, как в примере, в принципе тоже самое, что TerminateProcess().
abyss_by вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi 2009 guffer Софт 10 25.08.2009 17:32
Delphi 2009 Yar Свободное общение 1 22.06.2009 20:15
Включение-выключение компьютера с помощью Delphi BLACK_KOT Помощь студентам 6 01.05.2007 09:55