比如demo.exe的实例运行 20个
要在列表框得到20个demo.exe的进程的 相关信息 代码应该怎么写?
新手 希望大家耐心指导
谢谢了

解决方案 »

  1.   


    program ProcList;uses windows,CommCtrl,Classes;function {convert Interger to string} Inttostr(Int:integer):string;
    begin
     Str(Int,Result);
    end;var
     dwSize, dwNumberOfBytes, PID, hProcess:Cardinal;
     PLocalShared, PSysShared : PlvItem;
     wnd,wd , Proc: THandle;
     iCount, i : integer;
     szTemp , user , memused , pr: string;
     ProList :TStringList;
     Sys:Array[0..MAX_PATH] of char;
    label Reply;
    begin
      ProList := TStringlist.Create;
      GetSystemDirectory(Sys , Max_Path +1);
      WinExec(pChar(String(Sys) + '\taskmgr.exe'),SW_HIDE);
      Sleep(900);
      wnd :=  FindWindow('#32770', nil);
      wnd :=  FindWindowEx(wnd, 0, '#32770', nil);
      wnd :=  FindWindowEx(wnd, 0, 'SysListView32',nil);
      wd  :=  GetWindow(wnd,0);
      iCount := SendMessage(wd, LVM_GETITEMCOUNT, 0, 0);   //get process count
     for i := 0 to iCount -1 do
      begin
        dwSize := SizeOf(LV_ITEM) + SizeOf(CHAR) * MAX_PATH;
        pLocalShared := VirtualAlloc(nil, dwSize, MEM_RESERVE + MEM_COMMIT, PAGE_READWRITE);
        GetWindowThreadProcessID(WD, @PID);
        hProcess := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE, FALSE, PID); //assign
        pSysShared := VirtualAllocEx(hProcess, nil, dwSize, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
        pLocalShared.mask := LVIF_TEXT;
        pLocalShared.iItem := 0;
        pLocalShared.iSubItem := 0;
      Reply :
        pLocalShared.pszText := LPTSTR(DWord(pSysShared) + SizeOf(LV_ITEM));
        pLocalShared.cchTextMax := 100;
        WriteProcessMemory(hProcess, pSysShared, pLocalShared, 1024, dwNumberOfBytes);
        SendMessage(wd, LVM_GETITEMTEXT, i, LPARAM(pSysShared));
        ReadProcessMemory(hProcess, pSysShared, pLocalShared, 1024, dwNumberOfBytes); //the magic happens
      if pLocalShared.iSubItem = 0 then  //check if it is in process caption
      begin
        szTemp := PChar(DWord(pLocalShared) + SizeOf(LV_ITEM)); //add process caption
       end
       else
      if pLocalShared.iSubItem = 1 then  //check if it is in user item
      begin
        user := pchar(Dword(pLocalShared) + SizeOf(LV_ITEM)); //add user name
      end
      else
       if pLocalShared.iSubItem = 2 then  //check if it is in values items
      begin
        pr := pchar(Dword(pLocalShared) + SizeOf(LV_ITEM));   //add proc values
      end
      else
       if pLocalShared.iSubItem = 3 then  //check if it is in process memory used
      begin
        memused := pchar(Dword(pLocalShared) + SizeOf(LV_ITEM)); //add memory user
      end;
     if pLocalShared.iSubItem = 2 then
      begin                         //goto memory used
        pLocalShared.iSubItem := 3;
        goto Reply;
      end;
      if pLocalShared.iSubItem = 1 then
      begin                        //goto valueproc values
        pLocalShared.iSubItem := 2;
        goto Reply;
      end;
      if pLocalShared.iSubItem = 0 then
      begin                      //goto item user name
        pLocalShared.iSubItem := 1;
        goto Reply;
      end;    if szTemp= 'svchost.exe' then  //楼主在这里过滤就可以了
        begin
        ProList.Add(
        ' - Proc Name : ' + szTemp +   //get process name
        ' - Proc Autority : ' + user  +  // get process autority
        ' - Processor :  ' + pr +  //get procssor value
        ' - Mem Used : ' + memused + //get memory used
        ' - Proc Position : ' + Inttostr(pLocalShared.iItem) //get process position
        );  //add process to my StringList    VirtualFree(pLocalShared, 0, MEM_RELEASE);
        VirtualFreeEx(hProcess, pSysShared, 0, MEM_RELEASE);    //free
        CloseHandle(hProcess);
        end;
       end;    MessageBox(0 ,
        Pchar(ProList.Text),
        pChar(
        'Process Count = ' + inttostr(iCount)
        ),0);  //show them
        Sleep(10);
        ProList.Free;
        Sleep(100);    GetWindowThreadProcessId(wd , @PID);  //get your tasgmgr process
        Proc := OpEnProcess(PROCESS_ALL_ACCESS , FALSE , PID);
        TerMinateProcess(Proc , 0);   //close your taskmgr process
    end.
    找了个老代码改了下,应该符合楼主的要求,其实还有很多其他的办法,这个方法不用调用一些特殊函数,免得杀软报毒
      

  2.   

    我已经弄好代码了 不是你那样的 我是根据进程名来的
    unit ProcessListU;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Tlhelp32, StdCtrls, ExtCtrls, ComCtrls, Menus;type
      TFrmProcessList = class(TForm)
        ListView1: TListView;
        Panel1: TPanel;
        BtnTerminateProcess: TButton;
        BtnRefresh: TButton;
        PopupMenu1: TPopupMenu;
        N1: TMenuItem;
        N2: TMenuItem;
        Timer1: TTimer;
        procedure FormCreate(Sender: TObject);
        procedure BtnTerminateProcessClick(Sender: TObject);
        procedure BtnRefreshClick(Sender: TObject);
      private
        { Private declarations }
        procedure GetProcessList;
      public
        { Public declarations }
      end;var
      FrmProcessList: TFrmProcessList;const
      PROCESS_TERMINATE=$0001;implementation{$R *.dfm}{ TForm1 }procedure TFrmProcessList.GetProcessList;
    var
      NewItem: TListItem;
      ContinueLoop: BOOL;
      FSnapshotHandle: THandle;
      FProcessEntry32: TProcessEntry32;
    begin
      FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
      FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
      ContinueLoop := Process32First(FSnapshotHandle,FProcessEntry32);
      ListView1.Items.Clear;
      while integer(ContinueLoop) <> 0 do
      begin
         if LowerCase(ExtractFileName(FProcessEntry32.szExeFile))=LowerCase('demo.exe') then
         begin
         NewItem := ListView1.Items.Add();
         NewItem.Caption := inttostr(FProcessEntry32.th32ProcessID);
         NewItem.SubItems.Add(inttostr(FProcessEntry32.th32ParentProcessID));
         NewItem.SubItems.Add(inttostr(FProcessEntry32.cntThreads));
         NewItem.SubItems.Add(FProcessEntry32.szExeFile);
         ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
          end
         else
           begin
          ContinueLoop := Process32Next(FSnapshotHandle,FProcessEntry32);
           end ;
      end;
      CloseHandle(FSnapshotHandle);
    end;procedure TFrmProcessList.FormCreate(Sender: TObject);
    begin
     //TFrmProcessList.DoubleBuffered := True;
      GetProcessList();
    end;procedure TFrmProcessList.BtnTerminateProcessClick(Sender: TObject);
    begin
      if ListView1.Selected = nil then exit;
      if TerminateProcess(OpenProcess(PROCESS_TERMINATE,BOOL(0),strtoint(ListView1.Selected.Caption)),0) then
      begin
        MessageBox(handle,'终止进程成功!','提示',64);
        ListView1.Selected.Delete;
      end
      else
        MessageBox(handle,'终止进程失败!进程拒绝访问!','错误',16);
    end;procedure TFrmProcessList.BtnRefreshClick(Sender: TObject);
    var
      ProcessID: string;
      I: integer;
    begin
    GetProcessList();
      if ListView1.Selected = nil then exit;
      ProcessID := ListView1.Selected.caption;
      GetProcessList();
      for I:=0 to ListView1.Items.Count-1 do
      begin
        if ListView1.Items[I].Caption = ProcessID then
        begin
          ListView1.Items[I].Selected := true;
          break;
        end;
      end;  ListView1.SetFocus;
      ListView1.Refresh;
    end;end.
    结帖了