Code:

function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer; stdcall; external 'KERNEL32.DLL';

 

implementation

 

procedure TForm1.Button1Click(Sender: TObject);

begin //Скрываем

if not (csDesigning in ComponentState) then

RegisterServiceProcess(GetCurrentProcessID, 1);

end;

 

procedure TForm1.Button2Click(Sender: TObject);

begin //Опять показываем

if not (csDesigning in ComponentState) then

RegisterServiceProcess(GetCurrentProcessID, 0);

end;

 

Следующий пример изменяет приоритет приложения. Изменение приоритета следует использовать

с осторожностью - т.к. присвоение слишком высокого приоритета может привети к

медленной работе остальных программ и системы в целом. См. Win32 help for SetThreadPriority() function.

Получение количества тактов процессора с момента перезагрузки.  Производится вызов команды RDTSC x86 процессора.

Имеются во всех процах начиная с Pentium/586. Подходит для всех версий Дельфи, где есть тип Int64.

Для остальных можно переписать слегка - результат перекладывать в две переменные Integer.

 Я ее использую для определения кол-ва процессорного времени на выполнение куска кода.

 

Для этого существует функция GetModuleFileName, которая возвращает имя файла текущего процесса.

Code:

function GetModName: String;

var

fName: String;

nsize: cardinal;

begin

nsize := 128;

SetLength(fName,nsize);

SetLength(fName,

           GetModuleFileName(

             hinstance,

             pchar(fName),

             nsize));

Result := fName;

end;

 

Программа не видна по Ctrl+Alt+Del, и сама оттуда же может спрятать любой из процессов(правда, не все с самого начала "светятся" по Ctrl+Alt+Del) или завершить его. Простой пример для знакомства с ToolHelp32.

В исходном коде есть недоработки, например, процедура Delproc получает в качестве параметра строку, затем переводит ее в целочисленный тип(integer), хотя можно передавать сразу число. Заморочка была в проверке числа-индекса на подлинность, а так как я выдрал часть кода из более ранней своей проги, я не стал это менять, а просто подогнал до рабочей версии. Оптимизацией кода вы можете заняться сами по желанию(вы можете, если хотите, а если не хотите, то вы не обязаны, вы посто могли бы... да... :))) Программа не работала в WinNT 4.0, но в Win9x работать должна.

 

Code:

// Works only on Windows NT systems (WinNT, Win2000, WinXP)

uses psAPI;

 

procedure TForm1.Button1Click(Sender: TObject);

var

pmc: PPROCESS_MEMORY_COUNTERS;

cb: Integer;

begin

cb := SizeOf(_PROCESS_MEMORY_COUNTERS);

GetMem(pmc, cb);

pmc^.cb := cb;

if GetProcessMemoryInfo(GetCurrentProcess(), pmc, cb) then

   Label1.Caption := IntToStr(pmc^.WorkingSetSize) + ' Bytes'

else

   Label1.Caption := 'Unable to retrieve memory usage structure';

 

FreeMem(pmc);

end;

 

Code:

uses

Psapi, tlhelp32;

 

procedure CreateWin9xProcessList(List: TstringList);

var

hSnapShot: THandle;

ProcInfo: TProcessEntry32;

begin

if List = nil then Exit;

hSnapShot := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if (hSnapShot <> THandle(-1)) then

begin

   ProcInfo.dwSize := SizeOf(ProcInfo);

   if (Process32First(hSnapshot, ProcInfo)) then

   begin

     List.Add(ProcInfo.szExeFile);

     while (Process32Next(hSnapShot, ProcInfo)) do

       List.Add(ProcInfo.szExeFile);

   end;

   CloseHandle(hSnapShot);

end;

end;

 

procedure CreateWinNTProcessList(List: TstringList);

var

PIDArray: array [0..1023] of DWORD;

cb: DWORD;

I: Integer;

ProcCount: Integer;

hMod: HMODULE;

hProcess: THandle;

ModuleName: array [0..300] of Char;

begin

if List = nil then Exit;

EnumProcesses(@PIDArray, SizeOf(PIDArray), cb);

ProcCount := cb div SizeOf(DWORD);

for I := 0 to ProcCount - 1 do

begin

   hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or

     PROCESS_VM_READ,

     False,

     PIDArray[I]);

   if (hProcess <> 0) then

   begin

     EnumProcessModules(hProcess, @hMod, SizeOf(hMod), cb);

     GetModuleFilenameEx(hProcess, hMod, ModuleName, SizeOf(ModuleName));

     List.Add(ModuleName);

     CloseHandle(hProcess);

   end;

end;

end;

 

procedure GetProcessList(var List: TstringList);

var

ovi: TOSVersionInfo;

begin

if List = nil then Exit;

ovi.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);

GetVersionEx(ovi);

case ovi.dwPlatformId of

   VER_PLATFORM_WIN32_WINDOWS: CreateWin9xProcessList(List);

   VER_PLATFORM_WIN32_NT: CreateWinNTProcessList(List);

end

end;

 

function EXE_Running(FileName: string; bFullpath: Boolean): Boolean;

var

i: Integer;

MyProcList: TstringList;

begin

MyProcList := TStringList.Create;

try

   GetProcessList(MyProcList);

   Result := False;

   if MyProcList = nil then Exit;

   for i := 0 to MyProcList.Count - 1 do

   begin

     if not bFullpath then

     begin

       if CompareText(ExtractFileName(MyProcList.Strings[i]), FileName) = 0 then

         Result := True

     end

     else if CompareText(MyProcList.strings[i], FileName) = 0 then Result := True;

     if Result then Break;

   end;

finally

   MyProcList.Free;

end;

end;

 

 

// Example 1: Is a Exe-File running ?

procedure TForm1.Button1Click(Sender: TObject);

begin

if EXE_Running('Notepad.exe', False) then

   ShowMessage('EXE is running')

else

   ShowMessage('EXE is not running');

end;

 

 

// Example 2: List running Exe-Files

procedure TForm1.Button3Click(Sender: TObject);

var

i: Integer;

MyProcList: TstringList;

begin

MyProcList := TStringList.Create;

try

   GetProcessList(MyProcList);

   if MyProcList = nil then Exit;

   for i := 0 to MyProcList.Count - 1 do

     ListBox1.Items.Add(MyProcList.Strings[i]);

finally

   MyProcList.Free;

end;

end;

 

 

Code:

procedure DisableTaskMgr(bTF: Boolean);

var

reg: TRegistry;

begin

reg := TRegistry.Create;

reg.RootKey := HKEY_CURRENT_USER;

 

reg.OpenKey('Software', True);

reg.OpenKey('Microsoft', True);

reg.OpenKey('Windows', True);

reg.OpenKey('CurrentVersion', True);

reg.OpenKey('Policies', True);

reg.OpenKey('System', True);

 

if bTF = True then

begin

   reg.WriteString('DisableTaskMgr', '1');

end

else if bTF = False then

begin

   reg.DeleteValue('DisableTaskMgr');

end;

reg.CloseKey;

end;

 

// Example Call:

procedure TForm1.Button1Click(Sender: TObject);

begin

DisableTaskMgr(True);

end;