Så skal man have fat i alle processer der køre, der efter udvælge den man vil stoppe og så kalde den med en (WM_ENDSESSION eller WM_QUERYENDSESSION .. er der ikke en der hedder WM_QUIT?).
Hvordan du får process listen ved jeg ikke lige :( Men vis du finder ud af det vil jeg gerne vide hvordan :)
type TProcList = class(TList) procedure Clear; override; end;
procedure TProcList.Clear; var I: Integer; begin for I := 0 to Count - 1 do Dispose(PProcessEntry32(Items[I])); inherited Clear; end;
{ TWin95Info }
constructor TWin95Info.Create; begin FProcList := TProcList.Create; FWinIcon := LoadImage(0, IDI_WINLOGO, IMAGE_ICON, LR_DEFAULTSIZE, LR_DEFAULTSIZE, LR_DEFAULTSIZE or LR_DEFAULTCOLOR or LR_SHARED); end;
destructor TWin95Info.Destroy; begin DestroyIcon(FWinIcon); if FSnap > 0 then CloseHandle(FSnap); FProcList.Free; inherited Destroy; end;
procedure TWin95Info.FillProcessInfoList(ListView: TListView; ImageList: TImageList); var I: Integer; ExeFile: string; PE: TProcessEntry32; HAppIcon: HIcon; begin Refresh; ListView.Columns.Clear; ListView.Items.Clear; for I := Low(ProcessInfoCaptions) to High(ProcessInfoCaptions) do with ListView.Columns.Add do begin if I = 0 then Width := 285 else Width := 75; Caption := ProcessInfoCaptions[I]; end; for I := 0 to FProcList.Count - 1 do begin PE := PProcessEntry32(FProcList.Items[I])^; HAppIcon := ExtractIcon(HInstance, PE.szExeFile, 0); try if HAppIcon = 0 then HAppIcon := FWinIcon; ExeFile := PE.szExeFile; if ListView.ViewStyle = vsList then ExeFile := ExtractFileName(ExeFile); // insert new item, set its caption, add subitems with ListView.Items.Add, SubItems do begin Caption := ExeFile; Data := FProcList.Items[I]; Add(IntToStr(PE.cntThreads)); Add(IntToHex(PE.th32ProcessID, 8)); Add(IntToHex(PE.th32ParentProcessID, 8)); if ImageList <> nil then ImageIndex := ImageList_AddIcon(ImageList.Handle, HAppIcon); end; finally if HAppIcon <> FWinIcon then DestroyIcon(HAppIcon); end; end; end;
procedure TWin95Info.Refresh; var PE: TProcessEntry32; PPE: PProcessEntry32; begin FProcList.Clear; if FSnap > 0 then CloseHandle(FSnap); FSnap := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0); if FSnap = INVALID_HANDLE_VALUE then raise Exception.Create('CreateToolHelp32Snapshot failed'); PE.dwSize := SizeOf(PE); if Process32First(FSnap, PE) then // get process repeat New(PPE); // create new PPE PPE^ := PE; // fill it FProcList.Add(PPE); // add it to list until not Process32Next(FSnap, PE); // get next process end;
procedure TWin95Info.ShowProcessProperties(Cookie: Pointer); begin ShowProcessDetails(PProcessEntry32(Cookie)); end;
Det passe nok når de siger det... NT er lidt mere striks end win9x med hensyn til sikkerhed! Måske hvis man køre det i en DLL, de plejer at have højere systemadgang. Men så igen hvis NT ikke understytter det :(
Når du har ProcessID'et kan du lukke processen ned sådanne: (ID=ProcessID, PHandle:Cardinal)
PHandle := OpenProcess(PROCESS_TERMINATE,false,ID); If TerminateProcess(PHandle,1) then showmessage('Ok') else showmessage('Fail!'); CloseHandle(PHandle);
Det var jo bare det der skulle til... Hvorfor kunne vi ikke finde det API kald før?
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.