Prozess-Viewer-Komponente
Eine Komponente, die alle zeigt laufende Prozesse, aber auch nicht nur auf WinNT
unter Windows 98/95!
Eine Komponente, die zeigt alle aktiven Prozesse, nicht nur auf WinNT aber
auch unter Windows 98/95!
Es hat auch eine öffentliche Methode dabei KillSelectedProcess, ich nehme an, du
kann herausfinden, was sie tut...
Es ersparte mir eine Menge Ärger und ersparte mir eine Menge muss
Starten Sie mein System auf meinem windows98-Rechner neu...
Nun, ist hier die Quelle dafür:
Was du tun musst, ist eine neue Einheit zu machen, kopieren Sie diesen Text in Ihr
und das Gerät als GgProcessViewer speichern.
Dann Sie in in Ihrer Komponente-Palette mit installieren können die
Delphi-Hauptmenü Komponente/installieren der Komponente...
Haben Sie viel Spaß...
Einheit GgProcessViewer;
Schnittstelle
verwendet
Windows, SysUtils, Klassen, Steuerelemente, Grids, ExtCtrls, Nachrichten,
tlHelp32, Dialoge;
Typ
NT-Funktionen zum Abrufen von Prozessinformationen:
TEnumProcesses = Function (LpidProcess: LPDWORD; Cb: DWORD;
Var CbNeeded: DWORD): BOOL; StdCall; externe cPSAPIDLL;
TGetModuleBaseNameA = Function (hProcess: THandle; hModule: HMODULE;
LpBaseName: PAnsiChar; nSize: DWORD): DWORD; StdCall; externe cPSAPIDLL;
TGetModuleFileNameExA = Function (hProcess: THandle; hModule: HMODULE;
LpFilename: PAnsiChar; nSize: DWORD): DWORD; StdCall; externe cPSAPIDLL;
TEnumProcessModules = Function (hProcess: THandle; LphModule: LPDWORD;
CB: DWORD; Var LpcbNeeded: DWORD): BOOL; StdCall; externe cPSAPIDLL;
TPByte = ^ TB;
TB = Array [0..0] Byte;
ThackWinControl = class(TWinControl)
öffentliche
Eigenschaft Text;
Ende;
ThackGraphicControl = class(TGraphicControl)
öffentliche
Caption-Eigenschaft;
Ende;
TProcessTimeType = (PtCreationTime, PtExitTime, PtKernelTime,
PtUserTime, PtCPUTime);
TAfterRefreshProcesses = Procedure(Sender: TObject) des Objekts;
TBeforeRefreshProcesses = Procedure(Sender: TObject) des Objekts;
TggProcessViewer = class(TStringGrid)
Private
FProcessCount: Integer;
FAutoRefresh: Boolean;
FAfterRefreshProcesses: TAfterRefreshProcesses;
FBeforeRefreshProcesses: TBeforeRefreshProcesses;
RefreshTimer: TTimer;
Prozedur InitGridForNT;
Getprocesses des Verfahrens;
Prozedur GetProcessesOnNT;
Funktion SetProcessCount: Integer;
Prozedur GetProcessCount (const Value: Integer);
Prozedur GetTheProcessTimes(PID: integer);
Procedure SetAutoRefresh (const Value: Boolean);
Prozedur TimerAutoRefresh(Sender: TObject);
Prozedur InitGridForWinXX;
Prozedur GetProcessesOnWinXX;
geschützt
Adress-Inhaber der Verfahren für NT
EnumProcesses: TEnumProcesses;
GetModuleBaseNameA: TGetModuleBaseNameA;
GetModuleFileNameExA: TGetModuleFileNameExA;
EnumProcessModules: TEnumProcessModules;
öffentliche
Konstruktor Create(AOwner: TComponent); außer Kraft setzen;
Destruktor Destroy; außer Kraft setzen;
Prozedur aktualisieren;
Prozedur KillSelectedProcess;
veröffentlicht
Eigenschaft DoubleBuffered;
Eigenschaft ProcessCount: Integer lesen SetProcessCount schreiben GetProcessCount;
Eigenschaft AutoRefresh: Boolean Read FAutoRefresh schreiben SetAutoRefresh;
Eigenschaft AfterRefreshProcesses: TAfterRefreshProcesses
Lesen Sie FAfterRefreshProcesses schreiben FAfterRefreshProcesses;
Eigenschaft BeforeRefreshProcesses: TBeforeRefreshProcesses
Lesen Sie FBeforeRefreshProcesses schreiben FBeforeRefreshProcesses;
Ende;
Register des Verfahrens;
const
cPSAPIDLL = 'PSAPI.dll';
ProcessBasicInformation = 0;
Umsetzung
Register des Verfahrens;
beginnen
RegisterComponents ('GuidoG', [TggProcessViewer]);
Ende;
{TggProcessViewer}
Konstruktor TggProcessViewer.Create(AOwner: TComponent);
beginnen
erbte;
RefreshTimer: = TTimer.Create(Self);
RefreshTimer.OnTimer: = TimerAutoRefresh;
FixedCols: = 0;
DefaultRowHeight: = 15;
ColWidths [0]: = 120;
ColWidths [1]: = 60;
ColWidths [2]: = 50;
ColWidths [3]: = 360;
Optionen: = Optionen - [GoVertLine, GoHorzLine] +
[GoDrawFocusSelected, GoThumbTracking, GoColSizing, GoRowSizing];
GetProcesses;
FAutoRefresh: = TRUE;
Ende;
Prozedur TggProcessViewer.InitGridForNT;
beginnen
RowCount: = 7;
RowCount: = 2;
Zellen [0, 0]: = 'Prozess';
Zellen [1, 0]: = 'PID';
Zellen [2, 0]: = 'CPU-Zeit';
Zellen [3, 0]: = 'Kernel-Zeit';
Zellen [4, 0]: = 'Benutzerzeit';
Zellen [5, 0]: = 'Priority';
Zellen [6, 0]: = 'Ort';
Zellen [0, 1]: = '';
Zellen [1, 1]: = '';
Zellen [2, 1]: = '';
Zellen [3, 1]: = '';
Zellen [4, 1]: = '';
Zellen [5, 1]: = '';
Zellen [6, 1]: = '';
Ende;
Prozedur TggProcessViewer.InitGridForWinXX;
beginnen
RowCount: = 4;
RowCount: = 2;
Zellen [0, 0]: = 'Prozess';
Zellen [1, 0]: = 'PID';
Zellen [2, 0]: = 'Priority';
Zellen [3, 0]: = 'Ort';
Zellen [0, 1]: = '';
Zellen [1, 1]: = '';
Zellen [2, 1]: = '';
Zellen [3, 1]: = '';
Ende;
Prozedur TggProcessViewer.GetProcessesOnNT;
var
Ich: Integer;
PidNeeded: DWORD;
PIDList: Array [0..1000] von Integer;
PIDName: Array [0..MAX_PATH - 1] char;
PH: THandle;
hMod: HMODULE;
dwSize2: DWORD;
J,
ColBeforeRefresh: Integer;
PIDContentsBeforeRefresh: String;
beginnen
ColBeforeRefresh: = Col;
PIDContentsBeforeRefresh: = Zellen [1, Zeile];
Führen Sie (WM_SETREDRAW, 0, 0);
versuchen Sie
InitGridForNT;
Wenn nicht EnumProcesses (@PIDList PidNeeded, 1000,) dann
Heben Exception.Create('PSAPI. DLL nicht gefunden! Sind Sie sicher, dass Sie ' +
'Windows NT/Y2K laufen?');
für i: = 0 to (PidNeeded Div SizeOf (Integer) - 1) zu tun
beginnen
PH: = OpenProcess (PROCESS_QUERY_INFORMATION oder PROCESS_VM_READ,
FALSE, PIDList[I]);
Wenn PH <> 0 dann
beginnen
Wenn GetModuleFileNameExA (PH, 0, PIDName, SizeOf(PIDName)) > 0 dann
beginnen
Wenn EnumProcessModules (PH, @hMod, SizeOf(hMod), dwSize2) dann
beginnen
GetModuleFileNameExA (PH, hMod, PIDName, SizeOf(PIDName));
Zellen [0, RowCount - 1]: = ExtractFileName(PIDName);
Zellen [1, RowCount - 1]: = IntToStr(PIDList[I]);
GetTheProcessTimes(PIDList[I]);
RS GetPriorityClass(PH) der
HIGH_PRIORITY_CLASS: Zellen [5, RowCount - 1]: = 'Stark';
& nbsp Gilt: Zellen [5, RowCount - 1]: = 'Leerlauf';
NORMAL_PRIORITY_CLASS: Zellen [5, RowCount - 1]: = 'Normal';
REALTIME_PRIORITY_CLASS: Zellen [5, RowCount - 1]: = 'RealTime';
Ende;
Zellen [6, RowCount - 1]: = ExtractFilePath(PIDName);
Ende;
RowCount: = RowCount + 1;
CloseHandle(PH);
Ende;
Ende;
Ende;
Wenn RowCount > 2 dann
RowCount: = RowCount - 1;
FProcessCount: = RowCount - 1;
für J: = 1 bis RowCount - 1
Wenn Zellen [1, J] = PIDContentsBeforeRefresh then
beginnen
Col: = ColBeforeRefresh;
Zeile: = J;
Zu brechen;
Ende;
Schließlich
Führen Sie (WM_SETREDRAW, 1, 0);
Ungültig wird;
Ende;
Ende;
Prozedur TggProcessViewer.GetTheProcessTimes(PID: integer);
var
LpLocalFileTime: TFileTime;
LpSystemTime: TSystemTime;
PH: THandle;
hProcess: THandle;
LpCreationTime,
LpExitTime,
LpKernelTime,
LpUserTime: TFileTime;
KernelDay,
UserDay: Ganzzahl;
KernelTime,
UserTime: TDateTime;
Ergebnis,
StrHours: string;
beginnen
Ergebnis: = ' n/a';
hProcess: = PID;
PH: = OpenProcess (PROCESS_QUERY_INFORMATION, falsche, hProcess);
Wenn PH <> 0 dann
versuchen Sie
GetProcessTimes (PH, LpCreationTime, LpExitTime, LpKernelTime, LpUserTime);
FileTimeToLocalFileTime (LpCreationTime, LpLocalFileTime);
Erhalten Sie die Kernelzeit zu, und formatieren Sie es
FileTimeToSystemTime (LpKernelTime, LpSystemTime);
KernelDay: = lpSystemTime.wDay;
KernelTime: = SystemTimeToDateTime(lpSystemTime);
Ergebnis: = TimeToStr(KernelTime);
StrHours: = Kopieren (Ergebnis 1, Pos (': ', Ergebnis) - 1);
Löschen (Ergebnis 1, Pos (': ', Ergebnis) - 1);
Zellen [3, RowCount - 1]: = IntToStr (((KernelDay-1) * 24) +
StrToInt(strHours)) + Ergebnis;
Erhalten Sie die Benutzerzeit und formatieren Sie es
FileTimeToSystemTime (LpUserTime, LpSystemTime);
UserDay: = lpSystemTime.wDay;
UserTime: = SystemTimeToDateTime(lpSystemTime);
Ergebnis: = TimeToStr(UserTime);
StrHours: = Kopieren (Ergebnis 1, Pos (': ', Ergebnis) - 1);
Löschen (Ergebnis 1, Pos (': ', Ergebnis) - 1);
Zellen [4, RowCount - 1]: = IntToStr (((UserDay-1) * 24) +
StrToInt(strHours)) + Result;//TimeToStr(UserTime);
Berechnen Sie die cpu-Zeit und formatieren Sie es
Ergebnis: = TimeToStr (UserTime + KernelTime);
StrHours: = Kopieren (Ergebnis 1, Pos (': ', Ergebnis) - 1);
Löschen (Ergebnis 1, Pos (': ', Ergebnis) - 1);
Zellen [2, RowCount - 1]: = IntToStr (((UserDay-KernelDay) * 24) +
StrToInt(strHours)) + Ergebnis;
Schließlich
CloseHandle(PH);
Ende
Ende;
Prozedur TggProcessViewer.KillSelectedProcess;
var
PH: THandle;
LpExitCode: DWord;
hProcess: Kardinal;
beginnen
hProcess: = StrToInt64 (Zellen [1, Zeile]);
PH: = OpenProcess (PROCESS_TERMINATE oder PROCESS_QUERY_INFORMATION,
FALSCHE, hProcess);
Wenn PH <> 0 dann
beginnen
Wenn GetExitCodeProcess (PH, LpExitCode) dann
beginnen
Wenn MessageBox (behandeln, PChar ('Do you really want Ich versuche' +
zu diesem Prozess töten?'), 'Bestätigen',
MB_YESNO) = MrYES then
beginnen
TerminateProcess (PH, LpExitCode);
MessageBox (behandeln, PChar ('sollte jetzt tot...'),
PChar ('Check it out...'), MB_OK);
Ende;
Ende
sonst
MessageBox (behandeln, PChar ('Konnte nicht Apportieren der ExitCode' +
'für diesen Prozess.' + #13 + #13 +
SysErrorMessage(GetLastError)),
PChar ('etwas schiefgegangen...'), MB_OK);
CloseHandle(PH);
Ende
sonst
MessageBox (behandeln, PChar ('Keine Zugang zu diesem Prozess erhalten.' +
#13 + #13 + SysErrorMessage(GetLastError)),
PChar ('etwas schiefgegangen...'), MB_OK); Aktualisieren;
Ende;
Prozedur TggProcessViewer.Refresh;
beginnen
Wenn assigned(FBeforeRefreshProcesses) und nicht
(CsLoading in ComponentState) dann
FBeforeRefreshProcesses(Self);
GetProcesses;
Wenn assigned(FAfterRefreshProcesses) und nicht
(CsLoading in ComponentState) dann
FAfterRefreshProcesses(Self);
Ende;
Funktion TggProcessViewer.SetProcessCount: Integer;
beginnen
Ergebnis: = FProcessCount;
Ende;
Prozedur TggProcessViewer.GetProcessCount (const Value: Integer);
beginnen
FProcessCount: = RowCount - 1;
Ende;
Prozedur TggProcessViewer.SetAutoRefresh (const Value: boolean);
beginnen
FAutoRefresh: = Value;
RefreshTimer.Enabled: = FAutoRefresh;
Ende;
Destruktor TggProcessViewer.Destroy;
beginnen
FreeAndNil(RefreshTimer);
erbte;
Ende;
Prozedur TggProcessViewer.TimerAutoRefresh(Sender: TObject);
beginnen
RefreshTimer.OnTimer: = NIL;
Aktualisieren;
RefreshTimer.OnTimer: = TimerAutoRefresh;
Ende;
Prozedur TggProcessViewer.GetProcessesOnWinXX;
var
Faßt: THandle;
FoundOne: Bool;
ProcessEntry32: TProcessEntry32;
ExeFile: String;
J,
ColBeforeRefresh: Integer;
PIDContentsBeforeRefresh: String;
PriorityClass: DWord;
beginnen
ColBeforeRefresh: = Col;
PIDContentsBeforeRefresh: = Zellen [1, Zeile];
Führen Sie (WM_SETREDRAW, 0, 0);
versuchen Sie
InitGridForWinXX;
Faßt: CreateToolhelp32Snapshot = (TH32CS_SNAPALL, 0);
Wenn dann faßt <> 0
versuchen Sie
ProcessEntry32.dwSize: = SizeOf (TProces Entry32);
FoundOne: = Process32First (faßt, ProcessEntry32);
während der FoundOne zu tun
beginnen
ExeFile: = ProcessEntry32.szExeFile;
Zellen [0, RowCount - 1]: = ExtractFileName(ExeFile);
Zellen [1, RowCount - 1]: = IntToStr(ProcessEntry32.th32ProcessID);
PriorityClass: = GetPriorityClass(ProcessEntry32.th32ProcessID);
Wenn PriorityClass <> 0 dann
RS PriorityClass des
HIGH_PRIORITY_CLASS: Zellen [2, RowCount - 1]: = 'Stark';
Gilt: Zellen [2, RowCount - 1]: = 'Leerlauf';
NORMAL_PRIORITY_CLASS: Zellen [2, RowCount - 1]: = 'Normal';
REALTIME_PRIORITY_CLASS: Zellen [2, RowCount - 1]: = 'RealTime';
Ende
sonst
Zellen [2, RowCount - 1]: = IntToStr(ProcessEntry32.pcPriClassBase);
Zellen [3, RowCount - 1]: = ExtractFilePath(ExeFile);
RowCount: = RowCount + 1;
ProcessEntry32.dwSize: = SizeOf(TProcessEntry32);
FoundOne: = Process32Next (faßt, ProcessEntry32);
Ende;
Schließlich
CloseHandle(ahandle);
Ende;
Wenn RowCount > 2 dann
RowCount: = RowCount - 1;
FProcessCount: = RowCount - 1;
für J: = 1 bis RowCount - 1
Wenn Zellen [1, J] = PIDContentsBeforeRefresh then
beginnen
Col: = ColBeforeRefresh;
Zeile: = J;
Zu brechen;
Ende;
Schließlich
Führen Sie (WM_SETREDRAW, 1, 0);
Ungültig wird;
Ende;
Ende;
Prozedur TggProcessViewer.Getprocesses;
var
HandlePSAPI_DLL: THandle;
beginnen
HandlePSAPI_DLL: = LoadLibrary(cPSAPIDLL);
Wenn (HandlePSAPI_DLL <> 0) dann //Where auf NT/2000...
beginnen
@EnumProcesses: = GetProcAddress (HandlePSAPI_DLL, 'EnumProcesses');
@GetModuleBaseNameA: = GetProcAddress (HandlePSAPI_DLL, 'GetModuleBaseNameA');
@GetModuleFileNameExA: = GetProcAddress (HandlePSAPI_DLL, 'GetModuleFileNameExA');
@EnumProcessModules: = GetProcAddress (HandlePSAPI_DLL, 'EnumProcessModules');
GetProcessesOnNT;
FreeLibrary(HandlePSAPI_DLL);
Ende
sonst //Where unter Win95/98/ME
GetProcessesOnWinXX;
Ende;
Ende.
Prozess-Viewer-Komponente
Prozess-Viewer-Komponente : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Eine Komponente, die alle zeigt laufende Prozesse, aber auch nicht nur auf WinNT
unter Windows 98/95!
Eine Komponente, die zeigt alle aktiven Prozesse, nicht nur auf WinNT aber
auch unter Windows 98/95!
Es hat auch eine öffentliche Methode dabei KillSelectedProcess, ich nehme an, du
kann herausfinden, was sie tut...
Es ersparte mir eine Menge Ärger und ersparte mir eine Menge muss
Starten Sie mein System auf meinem windows98-Rechner neu...
Nun, ist hier die Quelle dafür:
Was du tun musst, ist eine neue Einheit zu machen, kopieren Sie diesen Text in Ihr
und das Gerät als GgProcessViewer speichern.
Dann Sie in in Ihrer Komponente-Palette mit installieren können die
Delphi-Hauptmenü Komponente/installieren der Komponente...
Haben Sie viel Spaß...
Einheit GgProcessViewer;
Schnittstelle
verwendet
Windows, SysUtils, Klassen, Steuerelemente, Grids, ExtCtrls, Nachrichten,
tlHelp32, Dialoge;
Typ
NT-Funktionen zum Abrufen von Prozessinformationen:
TEnumProcesses = Function (LpidProcess: LPDWORD; Cb: DWORD;
Var CbNeeded: DWORD): BOOL; StdCall; externe cPSAPIDLL;
TGetModuleBaseNameA = Function (hProcess: THandle; hModule: HMODULE;
LpBaseName: PAnsiChar; nSize: DWORD): DWORD; StdCall; externe cPSAPIDLL;
TGetModuleFileNameExA = Function (hProcess: THandle; hModule: HMODULE;
LpFilename: PAnsiChar; nSize: DWORD): DWORD; StdCall; externe cPSAPIDLL;
TEnumProcessModules = Function (hProcess: THandle; LphModule: LPDWORD;
CB: DWORD; Var LpcbNeeded: DWORD): BOOL; StdCall; externe cPSAPIDLL;
TPByte = ^ TB;
TB = Array [0..0] Byte;
ThackWinControl = class(TWinControl)
öffentliche
Eigenschaft Text;
Ende;
ThackGraphicControl = class(TGraphicControl)
öffentliche
Caption-Eigenschaft;
Ende;
TProcessTimeType = (PtCreationTime, PtExitTime, PtKernelTime,
PtUserTime, PtCPUTime);
TAfterRefreshProcesses = Procedure(Sender: TObject) des Objekts;
TBeforeRefreshProcesses = Procedure(Sender: TObject) des Objekts;
TggProcessViewer = class(TStringGrid)
Private
FProcessCount: Integer;
FAutoRefresh: Boolean;
FAfterRefreshProcesses: TAfterRefreshProcesses;
FBeforeRefreshProcesses: TBeforeRefreshProcesses;
RefreshTimer: TTimer;
Prozedur InitGridForNT;
Getprocesses des Verfahrens;
Prozedur GetProcessesOnNT;
Funktion SetProcessCount: Integer;
Prozedur GetProcessCount (const Value: Integer);
Prozedur GetTheProcessTimes(PID: integer);
Procedure SetAutoRefresh (const Value: Boolean);
Prozedur TimerAutoRefresh(Sender: TObject);
Prozedur InitGridForWinXX;
Prozedur GetProcessesOnWinXX;
geschützt
Adress-Inhaber der Verfahren für NT
EnumProcesses: TEnumProcesses;
GetModuleBaseNameA: TGetModuleBaseNameA;
GetModuleFileNameExA: TGetModuleFileNameExA;
EnumProcessModules: TEnumProcessModules;
öffentliche
Konstruktor Create(AOwner: TComponent); außer Kraft setzen;
Destruktor Destroy; außer Kraft setzen;
Prozedur aktualisieren;
Prozedur KillSelectedProcess;
veröffentlicht
Eigenschaft DoubleBuffered;
Eigenschaft ProcessCount: Integer lesen SetProcessCount schreiben GetProcessCount;
Eigenschaft AutoRefresh: Boolean Read FAutoRefresh schreiben SetAutoRefresh;
Eigenschaft AfterRefreshProcesses: TAfterRefreshProcesses
Lesen Sie FAfterRefreshProcesses schreiben FAfterRefreshProcesses;
Eigenschaft BeforeRefreshProcesses: TBeforeRefreshProcesses
Lesen Sie FBeforeRefreshProcesses schreiben FBeforeRefreshProcesses;
Ende;
Register des Verfahrens;
const
cPSAPIDLL = 'PSAPI.dll';
ProcessBasicInformation = 0;
Umsetzung
Register des Verfahrens;
beginnen
RegisterComponents ('GuidoG', [TggProcessViewer]);
Ende;
{TggProcessViewer}
Konstruktor TggProcessViewer.Create(AOwner: TComponent);
beginnen
erbte;
RefreshTimer: = TTimer.Create(Self);
RefreshTimer.OnTimer: = TimerAutoRefresh;
FixedCols: = 0;
DefaultRowHeight: = 15;
ColWidths [0]: = 120;
ColWidths [1]: = 60;
ColWidths [2]: = 50;
ColWidths [3]: = 360;
Optionen: = Optionen - [GoVertLine, GoHorzLine] +
[GoDrawFocusSelected, GoThumbTracking, GoColSizing, GoRowSizing];
GetProcesses;
FAutoRefresh: = TRUE;
Ende;
Prozedur TggProcessViewer.InitGridForNT;
beginnen
RowCount: = 7;
RowCount: = 2;
Zellen [0, 0]: = 'Prozess';
Zellen [1, 0]: = 'PID';
Zellen [2, 0]: = 'CPU-Zeit';
Zellen [3, 0]: = 'Kernel-Zeit';
Zellen [4, 0]: = 'Benutzerzeit';
Zellen [5, 0]: = 'Priority';
Zellen [6, 0]: = 'Ort';
Zellen [0, 1]: = '';
Zellen [1, 1]: = '';
Zellen [2, 1]: = '';
Zellen [3, 1]: = '';
Zellen [4, 1]: = '';
Zellen [5, 1]: = '';
Zellen [6, 1]: = '';
Ende;
Prozedur TggProcessViewer.InitGridForWinXX;
beginnen
RowCount: = 4;
RowCount: = 2;
Zellen [0, 0]: = 'Prozess';
Zellen [1, 0]: = 'PID';
Zellen [2, 0]: = 'Priority';
Zellen [3, 0]: = 'Ort';
Zellen [0, 1]: = '';
Zellen [1, 1]: = '';
Zellen [2, 1]: = '';
Zellen [3, 1]: = '';
Ende;
Prozedur TggProcessViewer.GetProcessesOnNT;
var
Ich: Integer;
PidNeeded: DWORD;
PIDList: Array [0..1000] von Integer;
PIDName: Array [0..MAX_PATH - 1] char;
PH: THandle;
hMod: HMODULE;
dwSize2: DWORD;
J,
ColBeforeRefresh: Integer;
PIDContentsBeforeRefresh: String;
beginnen
ColBeforeRefresh: = Col;
PIDContentsBeforeRefresh: = Zellen [1, Zeile];
Führen Sie (WM_SETREDRAW, 0, 0);
versuchen Sie
InitGridForNT;
Wenn nicht EnumProcesses (@PIDList PidNeeded, 1000,) dann
Heben Exception.Create('PSAPI. DLL nicht gefunden! Sind Sie sicher, dass Sie ' +
'Windows NT/Y2K laufen?');
für i: = 0 to (PidNeeded Div SizeOf (Integer) - 1) zu tun
beginnen
PH: = OpenProcess (PROCESS_QUERY_INFORMATION oder PROCESS_VM_READ,
FALSE, PIDList[I]);
Wenn PH <> 0 dann
beginnen
Wenn GetModuleFileNameExA (PH, 0, PIDName, SizeOf(PIDName)) > 0 dann
beginnen
Wenn EnumProcessModules (PH, @hMod, SizeOf(hMod), dwSize2) dann
beginnen
GetModuleFileNameExA (PH, hMod, PIDName, SizeOf(PIDName));
Zellen [0, RowCount - 1]: = ExtractFileName(PIDName);
Zellen [1, RowCount - 1]: = IntToStr(PIDList[I]);
GetTheProcessTimes(PIDList[I]);
RS GetPriorityClass(PH) der
HIGH_PRIORITY_CLASS: Zellen [5, RowCount - 1]: = 'Stark';
& nbsp Gilt: Zellen [5, RowCount - 1]: = 'Leerlauf';
NORMAL_PRIORITY_CLASS: Zellen [5, RowCount - 1]: = 'Normal';
REALTIME_PRIORITY_CLASS: Zellen [5, RowCount - 1]: = 'RealTime';
Ende;
Zellen [6, RowCount - 1]: = ExtractFilePath(PIDName);
Ende;
RowCount: = RowCount + 1;
CloseHandle(PH);
Ende;
Ende;
Ende;
Wenn RowCount > 2 dann
RowCount: = RowCount - 1;
FProcessCount: = RowCount - 1;
für J: = 1 bis RowCount - 1
Wenn Zellen [1, J] = PIDContentsBeforeRefresh then
beginnen
Col: = ColBeforeRefresh;
Zeile: = J;
Zu brechen;
Ende;
Schließlich
Führen Sie (WM_SETREDRAW, 1, 0);
Ungültig wird;
Ende;
Ende;
Prozedur TggProcessViewer.GetTheProcessTimes(PID: integer);
var
LpLocalFileTime: TFileTime;
LpSystemTime: TSystemTime;
PH: THandle;
hProcess: THandle;
LpCreationTime,
LpExitTime,
LpKernelTime,
LpUserTime: TFileTime;
KernelDay,
UserDay: Ganzzahl;
KernelTime,
UserTime: TDateTime;
Ergebnis,
StrHours: string;
beginnen
Ergebnis: = ' n/a';
hProcess: = PID;
PH: = OpenProcess (PROCESS_QUERY_INFORMATION, falsche, hProcess);
Wenn PH <> 0 dann
versuchen Sie
GetProcessTimes (PH, LpCreationTime, LpExitTime, LpKernelTime, LpUserTime);
FileTimeToLocalFileTime (LpCreationTime, LpLocalFileTime);
Erhalten Sie die Kernelzeit zu, und formatieren Sie es
FileTimeToSystemTime (LpKernelTime, LpSystemTime);
KernelDay: = lpSystemTime.wDay;
KernelTime: = SystemTimeToDateTime(lpSystemTime);
Ergebnis: = TimeToStr(KernelTime);
StrHours: = Kopieren (Ergebnis 1, Pos (': ', Ergebnis) - 1);
Löschen (Ergebnis 1, Pos (': ', Ergebnis) - 1);
Zellen [3, RowCount - 1]: = IntToStr (((KernelDay-1) * 24) +
StrToInt(strHours)) + Ergebnis;
Erhalten Sie die Benutzerzeit und formatieren Sie es
FileTimeToSystemTime (LpUserTime, LpSystemTime);
UserDay: = lpSystemTime.wDay;
UserTime: = SystemTimeToDateTime(lpSystemTime);
Ergebnis: = TimeToStr(UserTime);
StrHours: = Kopieren (Ergebnis 1, Pos (': ', Ergebnis) - 1);
Löschen (Ergebnis 1, Pos (': ', Ergebnis) - 1);
Zellen [4, RowCount - 1]: = IntToStr (((UserDay-1) * 24) +
StrToInt(strHours)) + Result;//TimeToStr(UserTime);
Berechnen Sie die cpu-Zeit und formatieren Sie es
Ergebnis: = TimeToStr (UserTime + KernelTime);
StrHours: = Kopieren (Ergebnis 1, Pos (': ', Ergebnis) - 1);
Löschen (Ergebnis 1, Pos (': ', Ergebnis) - 1);
Zellen [2, RowCount - 1]: = IntToStr (((UserDay-KernelDay) * 24) +
StrToInt(strHours)) + Ergebnis;
Schließlich
CloseHandle(PH);
Ende
Ende;
Prozedur TggProcessViewer.KillSelectedProcess;
var
PH: THandle;
LpExitCode: DWord;
hProcess: Kardinal;
beginnen
hProcess: = StrToInt64 (Zellen [1, Zeile]);
PH: = OpenProcess (PROCESS_TERMINATE oder PROCESS_QUERY_INFORMATION,
FALSCHE, hProcess);
Wenn PH <> 0 dann
beginnen
Wenn GetExitCodeProcess (PH, LpExitCode) dann
beginnen
Wenn MessageBox (behandeln, PChar ('Do you really want Ich versuche' +
zu diesem Prozess töten?'), 'Bestätigen',
MB_YESNO) = MrYES then
beginnen
TerminateProcess (PH, LpExitCode);
MessageBox (behandeln, PChar ('sollte jetzt tot...'),
PChar ('Check it out...'), MB_OK);
Ende;
Ende
sonst
MessageBox (behandeln, PChar ('Konnte nicht Apportieren der ExitCode' +
'für diesen Prozess.' + #13 + #13 +
SysErrorMessage(GetLastError)),
PChar ('etwas schiefgegangen...'), MB_OK);
CloseHandle(PH);
Ende
sonst
MessageBox (behandeln, PChar ('Keine Zugang zu diesem Prozess erhalten.' +
#13 + #13 + SysErrorMessage(GetLastError)),
PChar ('etwas schiefgegangen...'), MB_OK); Aktualisieren;
Ende;
Prozedur TggProcessViewer.Refresh;
beginnen
Wenn assigned(FBeforeRefreshProcesses) und nicht
(CsLoading in ComponentState) dann
FBeforeRefreshProcesses(Self);
GetProcesses;
Wenn assigned(FAfterRefreshProcesses) und nicht
(CsLoading in ComponentState) dann
FAfterRefreshProcesses(Self);
Ende;
Funktion TggProcessViewer.SetProcessCount: Integer;
beginnen
Ergebnis: = FProcessCount;
Ende;
Prozedur TggProcessViewer.GetProcessCount (const Value: Integer);
beginnen
FProcessCount: = RowCount - 1;
Ende;
Prozedur TggProcessViewer.SetAutoRefresh (const Value: boolean);
beginnen
FAutoRefresh: = Value;
RefreshTimer.Enabled: = FAutoRefresh;
Ende;
Destruktor TggProcessViewer.Destroy;
beginnen
FreeAndNil(RefreshTimer);
erbte;
Ende;
Prozedur TggProcessViewer.TimerAutoRefresh(Sender: TObject);
beginnen
RefreshTimer.OnTimer: = NIL;
Aktualisieren;
RefreshTimer.OnTimer: = TimerAutoRefresh;
Ende;
Prozedur TggProcessViewer.GetProcessesOnWinXX;
var
Faßt: THandle;
FoundOne: Bool;
ProcessEntry32: TProcessEntry32;
ExeFile: String;
J,
ColBeforeRefresh: Integer;
PIDContentsBeforeRefresh: String;
PriorityClass: DWord;
beginnen
ColBeforeRefresh: = Col;
PIDContentsBeforeRefresh: = Zellen [1, Zeile];
Führen Sie (WM_SETREDRAW, 0, 0);
versuchen Sie
InitGridForWinXX;
Faßt: CreateToolhelp32Snapshot = (TH32CS_SNAPALL, 0);
Wenn dann faßt <> 0
versuchen Sie
ProcessEntry32.dwSize: = SizeOf (TProces Entry32);
FoundOne: = Process32First (faßt, ProcessEntry32);
während der FoundOne zu tun
beginnen
ExeFile: = ProcessEntry32.szExeFile;
Zellen [0, RowCount - 1]: = ExtractFileName(ExeFile);
Zellen [1, RowCount - 1]: = IntToStr(ProcessEntry32.th32ProcessID);
PriorityClass: = GetPriorityClass(ProcessEntry32.th32ProcessID);
Wenn PriorityClass <> 0 dann
RS PriorityClass des
HIGH_PRIORITY_CLASS: Zellen [2, RowCount - 1]: = 'Stark';
Gilt: Zellen [2, RowCount - 1]: = 'Leerlauf';
NORMAL_PRIORITY_CLASS: Zellen [2, RowCount - 1]: = 'Normal';
REALTIME_PRIORITY_CLASS: Zellen [2, RowCount - 1]: = 'RealTime';
Ende
sonst
Zellen [2, RowCount - 1]: = IntToStr(ProcessEntry32.pcPriClassBase);
Zellen [3, RowCount - 1]: = ExtractFilePath(ExeFile);
RowCount: = RowCount + 1;
ProcessEntry32.dwSize: = SizeOf(TProcessEntry32);
FoundOne: = Process32Next (faßt, ProcessEntry32);
Ende;
Schließlich
CloseHandle(ahandle);
Ende;
Wenn RowCount > 2 dann
RowCount: = RowCount - 1;
FProcessCount: = RowCount - 1;
für J: = 1 bis RowCount - 1
Wenn Zellen [1, J] = PIDContentsBeforeRefresh then
beginnen
Col: = ColBeforeRefresh;
Zeile: = J;
Zu brechen;
Ende;
Schließlich
Führen Sie (WM_SETREDRAW, 1, 0);
Ungültig wird;
Ende;
Ende;
Prozedur TggProcessViewer.Getprocesses;
var
HandlePSAPI_DLL: THandle;
beginnen
HandlePSAPI_DLL: = LoadLibrary(cPSAPIDLL);
Wenn (HandlePSAPI_DLL <> 0) dann //Where auf NT/2000...
beginnen
@EnumProcesses: = GetProcAddress (HandlePSAPI_DLL, 'EnumProcesses');
@GetModuleBaseNameA: = GetProcAddress (HandlePSAPI_DLL, 'GetModuleBaseNameA');
@GetModuleFileNameExA: = GetProcAddress (HandlePSAPI_DLL, 'GetModuleFileNameExA');
@EnumProcessModules: = GetProcAddress (HandlePSAPI_DLL, 'EnumProcessModules');
GetProcessesOnNT;
FreeLibrary(HandlePSAPI_DLL);
Ende
sonst //Where unter Win95/98/ME
GetProcessesOnWinXX;
Ende;
Ende.
Prozess-Viewer-Komponente
By Wiezutun
Prozess-Viewer-Komponente : Mehreren tausend Tipps, um Ihr Leben einfacher machen.