Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Закрытие explorer-а.


Автор: <Spawn> 13.5.2003, 12:59
Я пытаюсь выгружать при старте своей проги explorer. Поискав среди всех классов окон в винде, единственным логически схожим оказался Internet Explorer_Hidden, но что бы я не делал он не завершается. Я пробовал делать CloseWindow и TerminatePorcess+GetExitCodeProcess(в CAD это ведь это как-то можно сделать), но ни чего не помогло. Подскажите, пожалуйста, как решить эту проблему (программа не для вредительских целей - для блокировки пользователю обычного интерфейса Windows в клубе(чтобы не рылись где не надоsmile.gif )). Заранее спасибо.

Автор: DonPager 13.5.2003, 14:25
А что, если вместо того чтобы выгружать эксплорер его просто не загружать ?
Например в 98 это делается в system.ini shell=someprog.exe...

Автор: <Spawn> 14.5.2003, 13:41
Цитата(DonPager @ 13.5.2003, 06:25)
А что, если вместо того чтобы выгружать эксплорер его просто не загружать ?
Например в 98 это делается в system.ini shell=someprog.exe...

Спасибо, если не найду способа выгрузть, то воспольуюсь этим (А выгрука была бы лучше тем, что подразумевается возможность выхода из мое проги админом клуба для каких либо настроек и тогда загружается explorer.exe, но при повторном запуске проги он выгружался бы опять. Твоим же способом придется делать перезагрузку компа или в ручную выгружать его в CAD и запускать мою прогу оттуда же)

Автор: varra 14.5.2003, 14:29
мне помогли таким кодом:
Код

function KillTask(ExeFileName: string): integer;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =  UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) =  UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;
...
KillTask('Explorer.EXE'); //Убивает все процессы с названием Explorer



Автор: <Spawn> 14.5.2003, 14:52
Цитата(varra @ 14.5.2003, 06:29)
мне помогли таким кодом:
Код

function KillTask(ExeFileName: string): integer;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =  UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) =  UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;
...
KillTask('Explorer.EXE'); //Убивает все процессы с названием Explorer

Большое спасибо)

Автор: <Spawn> 15.5.2003, 16:27
To varra: Почему то, завершая этим кодом Explorer, он через секунду запускается снова. И я не поиму, почему ты в TerminateProcess в ExitCode передаешь 0?

Автор: varra 16.5.2003, 05:17
Цитата
Почему то, завершая этим кодом Explorer, он через секунду запускается снова


какая ОС ?
в 98 у меня все работало, в 2000 - да, есть такой косяк

Автор: Mikel 17.5.2003, 17:30
Чтобы без особых проблем закрыть любое окно, воспользуйся этой функцией. В качестве параметра надо передать Handle окна. Закрывает всё, без wm_close.
Код

       Procedure Shut(Wnd:hWnd);
        Var
           pID,oph,ECode:Cardinal;
       begin
         GetWindowThreadProcessId(Wnd,@Pid);
         oph:=OpenProcess(PROCESS_TERMINATE,FALSE,PID);
         GetExitCodeProcess(oph,ECode);
         TerminateProcess(oph,ECode);
         CloseHandle(oph);
       end;

Автор: vasekprizrak 26.3.2010, 08:02
Помогите мне вот такие ошибки выдаются когда я вствляю код в программу (((


[Error] Unit1.pas(149): Undeclared identifier: 'TProcessEntry32'
[Error] Unit1.pas(152): Undeclared identifier: 'CreateToolhelp32Snapshot'
[Error] Unit1.pas(152): Undeclared identifier: 'TH32CS_SNAPPROCESS'
[Error] Unit1.pas(153): Missing operator or semicolon
[Error] Unit1.pas(154): Undeclared identifier: 'Process32First'
[Error] Unit1.pas(157): ')' expected but identifier 'szExeFile' found
[Error] Unit1.pas(170): Undeclared identifier: 'ConvDate'
[Error] Unit1.pas(173): Statement expected but 'FUNCTION' found


Автор: bems 27.3.2010, 20:20
Не туда вставляешь и не подключены нужные юниты. Читай литературу.

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