Moodsky 发表于 2007-2-8 10:53:39

进程、窗口句柄、文件属性、程序运行状态

uses TLHelp32,PsAPI;

(1)显示进程列表:
procedure TForm1.Button2Click(Sender: TObject);
var lppe: TProcessEntry32;
    found : boolean;
    Hand : THandle;
    P:DWORD;
    s:string;
begin
ListBox1.Items.Clear ;
Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);
found := Process32First(Hand,lppe);
while found do
begin
    s := StrPas(lppe.szExeFile);
    if lppe.th32ProcessID>0 then
      p := lppe.th32ProcessID
    else
      p := 0;
    ListBox1.Items.AddObject(s,pointer(p));//列出所有进程。
    found := Process32Next(Hand,lppe);
end;
end;

(2)杀死某进程:
procedure TForm1.Button3Click(Sender: TObject);
var lppe: TProcessEntry32;
    found : boolean;
    Hand : THandle;
    P:DWORD;
    sExeFile,sSelect:string;
    killed:boolean;
begin
p :=DWORD(ListBox1.Items.Objects);
if P<>0 then
begin
    killed := TerminateProcess(OpenProcess(PROCESS_TERMINATE,False,P),$FFFFFFFF);
    if not killed then
       messagebox(self.handle,pchar(sExeFile+'无法杀死!'),'提示',MB_OK or MB_ICONWARNING)
    else
      ListBox1.Items.Delete(ListBox1.ItemIndex);
end;
end;

(3)取得某进程EXE路径:
procedure TForm1.Button8Click(Sender: TObject);//usesPSAPI;
var
h:THandle;fileName:string; iLen:integer; hMod:HMODULE;cbNeeded,p:DWORD;
begin
p :=DWORD(ListBox1.Items.Objects);
h:=OpenProcess(PROCESS_ALL_ACCESS,false,p);      //p为 进程ID
ifh>0then
begin
    ifEnumProcessModules(h,@hMod,sizeof(hMod),cbNeeded)then
    begin
       SetLength(fileName,MAX_PATH);
       iLen:=GetModuleFileNameEx(h,hMod,PCHAR(fileName),MAX_PATH);
       ifiLen<>0then
       begin
         SetLength(fileName,StrLen(PCHAR(fileName)));
         ShowMessage(fileName);
       end;
    end;
    CloseHandle(h);
end;
end;

(4)取得窗口列表
begin
   ListBox1.Items.Clear ;
   EnumWindows(@EnumWindowsProc, 0);
end;

(5)杀死窗口进程
procedure TForm1.Button6Click(Sender: TObject);
var
H:THandle;
P:DWORD;
s:string;
killed:boolean;
begin
s := ListBox1.Items;
H:=FindWindow(nil,pchar(s));
if H<>0 then
begin
    GetWindowThreadProcessId(H,@P);
    if P<>0 then
      killed:=TerminateProcess(OpenProcess(PROCESS_TERMINATE,False,P),$FFFFFFFF);
    if not killed then
       messagebox(self.handle,pchar(s+'无法杀死!'),'提示',MB_OK or MB_ICONWARNING)
    else
      ListBox1.Items.Delete(ListBox1.ItemIndex);
end;
end;

(6)取得窗口进程路径:
procedure TForm1.Button9Click(Sender: TObject);
var
H:THandle;P,cbNeeded: DWORD;s,fileName:string;
iLen:integer;   hMod:HMODULE;
begin
s := ListBox1.Items;
H:=FindWindow(nil,pchar(s));

if H<>0 then
begin
    GetWindowThreadProcessId(H,@P);
    if P<>0 then
    begin
       h:=OpenProcess(PROCESS_ALL_ACCESS,false,p);      //p为 进程ID
       ifh>0then
       begin
         ifEnumProcessModules(h,@hMod,sizeof(hMod),cbNeeded)then
         begin
         SetLength(fileName,MAX_PATH);
         iLen:=GetModuleFileNameEx(h,hMod,PCHAR(fileName),MAX_PATH);
         ifiLen<>0then
         begin
                   SetLength(fileName,StrLen(PCHAR(fileName)));
                   ShowMessage(fileName);
         end;
         end;
         CloseHandle(h);
       end;
    end;
end;
end;

(7)文件属性:
procedure TForm1.Button1Click(Sender: TObject);
var
SR: TSearchRec;
V1, V2, V3, V4: integer;
const
dtFmt:string = 'YYYY-MM-DD HH:NN:SS';
begin
// ============== 方法一 ==================== //
if FindFirst(sFileName, faAnyFile, SR) = 0 then
begin
    Edit1.Text := intToStr(SR.Attr);   //文件属性
    Edit2.Text := intToStr(SR.Size);   //文件大小
    Edit3.Text := FormatDateTime(dtFmt,CovFileDate(SR.FindData.ftCreationTime));   //创建时间
    Edit4.Text := FormatDateTime(dtFmt,CovFileDate(SR.FindData.ftLastWriteTime));//最后修改时间
    Edit5.Text := FormatDateTime(dtFmt,CovFileDate(SR.FindData.ftLastAccessTime)); //最后访问时间

    if SR.Attr and faHidden <> 0 then
      FileSetAttr(sFileName, SR.Attr-faHidden);

    FindClose(SR);
end;

if GetFileVersion(sFileName,V1, V2, V3, V4) then
   Edit7.Text := intToStr(v1)+'.'+intToStr(v2)+'.'+intToStr(v3)+'.'+intToStr(v4);

// ============== 方法二 ==================== //
{
var
Attrs: Word;
f: file of Byte;   // 文件大小 必须要 定义为" file of byte" ,这样才能取出 bytes
size: Longint;

//文件属性
Attrs := FileGetAttr(sFileName);

Edit1.Text := intToStr(Attrs);

//文件大小
AssignFile(f, OpenDialog1.FileName);
Reset(f);
try
    AssignFile(f, sFileName);
    Reset(f);
    size := FileSize(f);
    Edit2.Text := intToStr(size);
finally
    CloseFile(f);
end;
}
end;

(8)判断程序是否在运行:
procedure TForm1.Button5Click(Sender: TObject);
var PrevInstHandle:Thandle;
AppTitle:pchar;
begin
AppTitle := pchar('test');
PrevInstHandle := FindWindow(nil, AppTitle);
    if PrevInstHandle <> 0 then begin
      if IsIconic(PrevInstHandle) then
      ShowWindow(PrevInstHandle, SW_RESTORE)
      else
      BringWindowToTop(PrevInstHandle);
      SetForegroundWindow(PrevInstHandle);
    end;
end;
页: [1]
查看完整版本: 进程、窗口句柄、文件属性、程序运行状态