Process Viewer Component

en komponent som viser alle prosesser som kjører, ikke bare på WinNT men alsoon windows 98/95! En komponent som viser alle prosesser som kjører, ikke bare på WinNT butalso på Windows 98/95! Den har også en offentlig metode calld KillSelectedProcess, jeg antar youcan finne ut hva det betyr ... det har spart meg mye trøbbel og lagret meg mye behov toreboot systemet mitt på min Windows98 maskin ... vel, her er kilden for det: Hva du må gjøre er å lage en ny enhet, kopier denne teksten i itand lagre enheten som ggProcessViewer.Then du kan installere i inn komponenten pall ved hjelp thedelphi hovedmenyen Component /Installer komponent ... Ha mye moro ... enhet ggProcessViewer; interfaceuses Windows, SysUtils, klasser, Kontroller, Rister, ExtCtrls, meldinger, tlHelp32, Dialoger -typen //NT Funksjoner for å få prosessen informasjon: TEnumProcesses = function (lpidProcess: LPDWORD; cb: DWORD; Var cbNeeded: DWORD): BOOL; STDCALL; //Ekstern cPSAPIDLL; TGetModuleBaseNameA = funksjon (hProcess: THandle; hModule: HMODULE; lpBaseName: PAnsiChar; nStørrelse: DWORD): DWORD; STDCALL; //Ekstern cPSAPIDLL; TGetModuleFileNameExA = funksjon (hProcess: THandle; hModule: HMODULE; lpFilename: PAnsiChar; nStørrelse: DWORD): DWORD; STDCALL; //Ekstern cPSAPIDLL; TEnumProcessModules = funksjon (hProcess: THandle; lphModule: LPDWORD; CB: DWORD; Var lpcbNeeded: DWORD): BOOL; STDCALL; //Ekstern cPSAPIDLL; TPByte = ^ TByte; TByte = array [0..0] i byte; ThackWinControl = klasse (TWinControl) offentlig eiendom Tekst; slutt; ThackGraphicControl = klasse (TGraphicControl) offentlig eiendom Caption; slutt; TProcessTimeType = (ptCreationTime, ptExitTime, ptKernelTime, ptUserTime, ptCPUTime); TAfterRefreshProcesses = prosedyre (Sender: TObject) objekt; TBeforeRefreshProcesses = prosedyre (Sender: TObject) objekt; TggProcessViewer = klasse (TStringGrid) private FProcessCount: integer; FAutoRefresh: boolean; FAfterRefreshProcesses: TAfterRefreshProcesses; FBeforeRefreshProcesses: TBeforeRefreshProcesses; RefreshTimer: TTimer; prosedyre InitGridForNT; prosedyre Getprocesses; prosedyre GetProcessesOnNT; funksjon SetProcessCount: integer; Prosedyren GetProcessCount (konst Verdi: integer); prosedyre GetTheProcessTimes (PID: integer); Prosedyren SetAutoRefresh (konst Verdi: boolean); Prosedyren TimerAutoRefresh (Sender: TObject); prosedyre InitGridForWinXX; prosedyre GetProcessesOnWinXX; beskyttede //Adresse innehavere av prosedyrene for NT EnumProcesses: TEnumProcesses; GetModuleBaseNameA: TGetModuleBaseNameA; GetModuleFileNameExA: TGetModuleFileNameExA; EnumProcessModules: TEnumProcessModules; offentlig konstruktør Opprette (AOwner: TComponent); styre; destructor Destroy; styre; prosedyre Refresh; prosedyre KillSelectedProcess; publisert eiendom DoubleBuffered; Eiendommen ProcessCount: Integer lese SetProcessCount skrive GetProcessCount; Eiendommen AutoRefresh: Boolean lese FAutoRefresh skrive SetAutoRefresh; eiendoms AfterRefreshProcesses: TAfterRefreshProcesses lese FAfterRefreshProcesses skrive FAfterRefreshProcesses; eiendoms BeforeRefreshProcesses: TBeforeRefreshProcesses lese FBeforeRefreshProcesses skrive FBeforeRefreshProcesses; enden, prosedyre Registeret; konst cPSAPIDLL = 'PSAPI.dll'; ProcessBasicInformation = 0; implementationprocedure register, begynner RegisterComponents ( 'GuidoG', [TggProcessViewer]); end; {TggProcessViewer} konstruktør TggProcessViewer.Create (AOwner: TComponent), begynner arvet; RefreshTimer: = TTimer.Create (Selv); RefreshTimer.OnTimer: = TimerAutoRefresh; FixedCols: = 0; DefaultRowHeight: = 15; ColWidths [0]: = 120; ColWidths [1]: = 60; ColWidths [2]: = 50; ColWidths [3]: = 360; Alternativer: = Alternativer - [goVertLine, goHorzLine] + [goDrawFocusSelected, goThumbTracking, goColSizing, goRowSizing]; GetProcesses; FAutoRefresh: = true; ende; prosedyre TggProcessViewer.InitGridForNT, begynner ColCount: = 7; ROWCOUNT: = 2; Celler [0, 0]: = 'Prosess'; -Celler [1, 0]: = 'PID'; Celler [2, 0]: = 'CPU-tid'; Celler [3, 0]: = 'Kernel tid'; Celler [4, 0]: = 'Bruker tid'; Celler [5, 0]: = 'Priority'; Celler [6, 0]: = 'Sted'; Celler [0, 1]: = ''; -Celler [1, 1]: = ''; -Celler [2, 1]: = ''; -Celler [3, 1]: = ''; Celler [4, 1]: = ''; Celler [5, 1]: = ''; Celler [6, 1]: = ''; ende; prosedyre TggProcessViewer.InitGridForWinXX, begynner ColCount: = 4; ROWCOUNT: = 2; Celler [0, 0]: = 'Prosess'; -Celler [1, 0]: = 'PID'; Celler [2, 0]: = 'Priority'; Celler [3, 0]: = 'Sted'; Celler [0, 1]: = ''; -Celler [1, 1]: = ''; -Celler [2, 1]: = ''; Celler [3, 1]: = ''; ende; prosedyre TggProcessViewer.GetProcessesOnNT, Var jeg: Integer; pidNeeded: DWORD; PIDList: array [0..1000] av Integer; PIDName: array [0..MAX_PATH - 1] av røye; PH: THandle; hMod: HMODULE; dwSize2: DWORD; J, ColBeforeRefresh: integer; PIDContentsBeforeRefresh: string; begynne ColBeforeRefresh: = Col; PIDContentsBeforeRefresh: = Cells [1, Row]; Utfør (WM_SETREDRAW, 0, 0); prøve InitGridForNT; om ikke EnumProcesses (PIDList, 1000, pidNeeded) deretter øke Exception.Create ( 'PSAPI.dll ikke funnet Er du sikker på at du!' + 'kjører Windows NT /Y2K?'); for i: = 0 til (pidNeeded div sizeof (heltall) - 1) gjør begynne PH: = OpenProcess (PROCESS_QUERY_INFORMATION eller PROCESS_VM_READ, USANN, PIDList [I]); hvis PH < > 0 da begynne hvis GetModuleFileNameExA (PH, 0, PIDName, sizeof (PIDName)) > 0 da begynne hvis EnumProcessModules (PH,hMod, sizeof (hMod), dwSize2), og start GetModuleFileNameExA (PH, hMod, PIDName, sizeof (PIDName)); Celler [0, ROWCOUNT - 1]: = ExtractFileName (PIDName); Celler [1, ROWCOUNT - 1]: = IntToStr (PIDList [I]); GetTheProcessTimes (PIDList [I]); case GetPriorityClass (PH) av HIGH_PRIORITY_CLASS: Cells [5, ROWCOUNT - 1]: = 'High'; IDLE_PRIORITY_CLASS: Celler [5, ROWCOUNT - 1]: = 'Idle'; NORMAL_PRIORITY_CLASS: Celler [5, ROWCOUNT - 1]: = 'Normal'; REALTIME_PRIORITY_CLASS: Celler [5, ROWCOUNT - 1]: = 'Realtime'; slutt; Celler [6, ROWCOUNT - 1]: = ExtractFilePath (PIDName); slutt; ROWCOUNT: = ROWCOUNT + 1; CloseHandle (PH); slutt; slutt; slutt; hvis ROWCOUNT > 2 da ROWCOUNT: = ROWCOUNT - 1; FProcessCount: = ROWCOUNT - 1; for J: = 1 til ROWCOUNT - en gjøre hvis Cells [1, J] = PIDContentsBeforeRefresh deretter begynne Col: = ColBeforeRefresh; Rad: = J; Gå i stykker; slutt; endelig Perform (WM_SETREDRAW, 1, 0); ugyldig; ende; end; prosedyre TggProcessViewer.GetTheProcessTimes (PID: integer); Var lpLocalFileTime: TFileTime; lpSystemTime: TSystemTime; PH: THandle; hProcess: THandle; lpCreationTime, lpExitTime, lpKernelTime, lpUserTime: TFileTime; KernelDay, UserDay: integer; KernelTime, UserTime: TDateTime; Resultat, strHours: string; begynne Resultat: = 'n /a'; hProcess: = PID; PH: = OpenProcess (PROCESS_QUERY_INFORMATION, USANN, hProcess); hvis PH < > 0 deretter prøve GetProcessTimes (PH, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime); FileTimeToLocalFileTime (lpCreationTime, lpLocalFileTime); //Få kjernen tid og formatere den FileTimeToSystemTime (lpKernelTime, lpSystemTime); KernelDay: = lpSystemTime.wDay; KernelTime: = SystemTimeToDateTime (lpSystemTime); Resultat: = TimeToStr (KernelTime); strHours: = Kopier (Resultat, 1, Pos ( ':', Result) - 1); Slett (Resultat, 1, Pos ( ':', Result) - 1); Celler [3, ROWCOUNT - 1]: = IntToStr (((KernelDay - 1) * 24) + StrToInt (strHours)) + Resultat; //Få bruker tid og formatere den FileTimeToSystemTime (lpUserTime, lpSystemTime); UserDay: = lpSystemTime.wDay; UserTime: = SystemTimeToDateTime (lpSystemTime); Resultat: = TimeToStr (UserTime); strHours: = Kopier (Resultat, 1, Pos ( ':', Result) - 1); Slett (Resultat, 1, Pos ( ':', Result) - 1); Celler [4, ROWCOUNT - 1]: = IntToStr (((UserDay - 1) * 24) + StrToInt (strHours)) + Resultat; //TimeToStr (UserTime); //Beregn cpu tid og formatere det Resultat: = TimeToStr (UserTime + KernelTime); strHours: = Kopier (Resultat, 1, Pos ( ':', Result) - 1); Slett (Resultat, 1, Pos ( ':', Result) - 1); Celler [2, ROWCOUNT - 1]: = IntToStr (((UserDay - KernelDay) * 24) + StrToInt (strHours)) + Resultat; endelig CloseHandle (PH); Sluttslutt, prosedyre TggProcessViewer.KillSelectedProcess, Div PH: THandle; lpExitCode: DWORD; hProcess: Cardinal, begynner hProcess: = StrToInt64 (Cells [1, Row]); PH: = OpenProcess (PROCESS_TERMINATE eller PROCESS_QUERY_INFORMATION, USANN, hProcess); hvis PH < > 0 begynne så hvis GetExitCodeProcess (PH, lpExitCode), og start hvis messagebox (håndtak, PChar ( 'Vil du virkelig at jeg skal prøve "+" for å drepe denne prosessen?'), 'Bekreft', MB_YESNO) = mrYES deretter begynne terminateProcess (PH, lpExitCode); Messagebox (Håndtak, PChar ( "bør være død nå ..."), PChar ( 'Sjekk det ut ... "), MB_OK); slutt; end annet messagebox (håndtak, PChar ( 'Kunne ikke hente den ExitCode' + + # 13 + # 13 + SysErrorMessage (GetLastError)), PChar ( 'Noe gikk galt ... "), MB_OK" for denne prosessen.'); CloseHandle (PH); end annet messagebox (håndtak, PChar ( 'Kunne ikke få tilgang til denne prosessen.' + # 13 + # 13 + SysErrorMessage (GetLastError)), PChar ( 'Noe gikk galt ... "), MB_OK); Oppdater; end; prosedyre TggProcessViewer.Refresh, begynne hvis tildelt (FBeforeRefreshProcesses) og ikke (csLoading i ComponentState) så FBeforeRefreshProcesses (Selv); GetProcesses; hvis tildelt (FAfterRefreshProcesses) og ikke (csLoading i ComponentState) deretter FAfterRefreshProcesses (Selv); end; funksjon TggProcessViewer.SetProcessCount: integer; begynne Resultat: = FProcessCount; ende; prosedyre TggProcessViewer.GetProcessCount (konst Verdi: integer), begynner FProcessCount: = ROWCOUNT - 1; ende; prosedyre TggProcessViewer.SetAutoRefresh (konst Verdi: boolean), begynner FAutoRefresh: = verdi; RefreshTimer.Enabled: = FAutoRefresh; ende; destructor TggProcessViewer.Destroy, begynner FreeAndNil (RefreshTimer); arvet; end; prosedyre TggProcessViewer.TimerAutoRefresh (Sender: TObject), begynner RefreshTimer.OnTimer: = NIL; Forfriske; RefreshTimer.OnTimer: = TimerAutoRefresh; ende; prosedyre TggProcessViewer.GetProcessesOnWinXX, Div aHandle: THandle; FoundOne: bool; ProcessEntry32: TProcessEntry32; Exefile: string; J, ColBeforeRefresh: integer; PIDContentsBeforeRefresh: string; PriorityClass: DWORD, begynner ColBeforeRefresh: = Col; PIDContentsBeforeRefresh: = Cells [1, Row]; Utfør (WM_SETREDRAW, 0, 0); prøve InitGridForWinXX; aHandle: = CreateToolhelp32Snapshot (TH32CS_SNAPALL, 0); hvis aHandle < > 0 deretter prøve ProcessEntry32.dwSize: = sizeof (TProcessEntry32); FoundOne: = Process32First (aHandle, ProcessEntry32); mens FoundOne gjøre begynne exefile: = ProcessEntry32.szExeFile; Celler [0, ROWCOUNT - 1]: = ExtractFileName (exefile); Celler [1, ROWCOUNT - 1]: = IntToStr (ProcessEntry32.th32ProcessID); PriorityClass: = GetPriorityClass (ProcessEntry32.th32ProcessID); hvis PriorityClass < > 0 da saken PriorityClass av HIGH_PRIORITY_CLASS: Cells [2, ROWCOUNT - 1]: = 'High'; IDLE_PRIORITY_CLASS: Celler [2, ROWCOUNT - 1]: = 'Idle'; NORMAL_PRIORITY_CLASS: Celler [2, ROWCOUNT - 1]: = 'Normal'; REALTIME_PRIORITY_CLASS: Celler [2, ROWCOUNT - 1]: = 'Realtime'; end else Cells [2, ROWCOUNT - 1]: = IntToStr (ProcessEntry32.pcPriClassBase); Celler [3, ROWCOUNT - 1]: = ExtractFilePath (exefile); ROWCOUNT: = ROWCOUNT + 1; ProcessEntry32.dwSize: = sizeof (TProcessEntry32); FoundOne: = Process32Next (aHandle, ProcessEntry32); slutt; endelig CloseHandle (ahandle); slutt; hvis ROWCOUNT > 2 da ROWCOUNT: = ROWCOUNT - 1; FProcessCount: = ROWCOUNT - 1; for J: = 1 til ROWCOUNT - en gjøre hvis Cells [1, J] = PIDContentsBeforeRefresh deretter begynne Col: = ColBeforeRefresh; Rad: = J; Gå i stykker; slutt; endelig Perform (WM_SETREDRAW, 1, 0); ugyldig; end, end, prosedyre TggProcessViewer.Getprocesses; Var HandlePSAPI_DLL: THandle, begynner HandlePSAPI_DLL: = Loadlibrary (cPSAPIDLL); if (HandlePSAPI_DLL < > 0) deretter //Hvor på NT /2000 ... begynneEnumProcesses: = GetProcAddress (HandlePSAPI_DLL, 'EnumProcesses'); GetModuleBaseNameA: = GetProcAddress (HandlePSAPI_DLL, 'GetModuleBaseNameA'); GetModuleFileNameExA: = GetProcAddress (HandlePSAPI_DLL, 'GetModuleFileNameExA'); EnumProcessModules: = GetProcAddress (HandlePSAPI_DLL, 'EnumProcessModules'); GetProcessesOnNT; FreeLibrary (HandlePSAPI_DLL); ende annet //Hvor på Win95 /98 /ME GetProcessesOnWinXX; end;. slutten



Previous:
Next Page: