Как сделать чтобы программа работала в фоновом режиме и ...
|
Normalnyj
|
Дата: Пятница, 15.11.2013, 20:26 | Сообщение # 1
|
Был не раз
Зарегистрирован: 08.11.2013
Группа: Пользователи
Сообщений: 9
Статус: Offline
|
Как сделать чтобы программа работала в фоновом режиме и следила за процессом explorer.exe и если этот процесс убить то программа его запустит ? Желательно если можете дайте исходник.Заранее спасибо. |
|
|
|
|
dolphin
|
Дата: Суббота, 16.11.2013, 17:18 | Сообщение # 2
|
Администратор
Сообщений: 902
Статус: Offline
|
что то вроде if not ProcessExist('explorer.exe') then
ShellExecute(0,nil,'explorer.exe',nil,nil,SW_SHOWNORMAL); код функций приведён ниже
Код
uses Tlhelp32;
function ProcessExists(ExeFileName: string): Boolean;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
if not InitToolHelp then
begin
Result:= False;
Exit;
end;
FSnapshotHandle := CT32SX(TH32CS_SNAPPROCESS,0);
FProcessEntry32.dwSize := SizeOf(FProcessEntry32);
ContinueLoop := Process32FirstX(FSnapshotHandle, FProcessEntry32);
Result := False;
while Integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
begin
Result := True;
end;
ContinueLoop := Process32NextX(FSnapshotHandle, FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;
Система: Windows 10 x64, Windows XP
Среды программирования: Delphi 7, Delphi 10 Seattle
Я не профессионал, я всего лишь любитель
Я не вредитель, я всего лишь теоретик
|
|
|
|
|
Neo
|
Дата: Среда, 20.11.2013, 15:24 | Сообщение # 3
|
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 316
Статус: Offline
|
А можно ещё в отдельном патоке открыть дескриптор процесса (h=OpenProcess),а потом заюзать WaitForSingleObject(h,INFINITE);потом,как сказал dolphin, ShellExecute(0,nil,'explorer.exe',nil,nil,SW_SHOWNORMAL); |
|
|
|
|
Neo
|
Дата: Среда, 20.11.2013, 15:48 | Сообщение # 4
|
Модератор
Зарегистрирован: 04.05.2010
Группа: Модераторы
Сообщений: 316
Статус: Offline
|
Вообщем вот код:
Код
function GetProcessID(const AProcessName: string): DWord;
var
lSnapHandle: THandle;
lProcStruct: PROCESSENTRY32;
lProcessName, lSnapProcessName: string;
lOSVerInfo: TOSVersionInfo;
begin
Result := INVALID_HANDLE_VALUE;
lSnapHandle := CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
if lSnapHandle = INVALID_HANDLE_VALUE then
Exit;
lProcStruct.dwSize := SizeOf(PROCESSENTRY32);
lOSVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
GetVersionEx(lOSVerInfo);
case lOSVerInfo.dwPlatformId of
VER_PLATFORM_WIN32_WINDOWS: lProcessName := AProcessName;
VER_PLATFORM_WIN32_NT: lProcessName :=ExtractFileName(AProcessName);
end;
if Process32First(lSnapHandle, lProcStruct) then
begin
try
repeat
lSnapProcessName := lProcStruct.szExeFile;
if AnsiUpperCase(lSnapProcessName) = AnsiUpperCase(lProcessName) then
begin
Result := lProcStruct.th32ProcessID;
Break;
end;
until not Process32Next(lSnapHandle, lProcStruct);
finally
CloseHandle(lSnapHandle);
end;
end;
end;
Procedure Thread;
Var PID,Handle: DWORD;
begin
while true do
begin
Pid:= GetProcessID('calc.exe');
Handle := OpenProcess(SYNCHRONIZE,false,PID);
if Handle <> 0 then
begin
WaitForSingleObject(Handle,INFINITE);
ShellExecute(0,nil,'calc.exe',nil,nil,SW_SHOWNORMAL);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
Var ThId,B: DWORD;
begin
ThId := CreateThread(nil,0,@Thread,0,0,B);
end;
Не забудь добавить TlHelp32,ShellAPI.
P.S
Хотя я бы на твоём месте этот код использовал для поддержки запущенности трояна
|
|
|
|
|
Normalnyj
|
Дата: Понедельник, 16.12.2013, 22:03 | Сообщение # 5
|
Был не раз
Зарегистрирован: 08.11.2013
Группа: Пользователи
Сообщений: 9
Статус: Offline
|
Спасибо вам всем большое!Я разобрался. |
|
|
|
|