• Delphi编程获取系统当前进程、窗口句柄、文件属性以(转)


    Delphi编程获取系统当前进程、窗口句柄、文件属性以及程序运行状态.

    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[ListBox1.itemindex]);
    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); //uses PSAPI;
    var
    h:THandle; fileName:string; iLen:integer; hMod:HMODULE;cbNeeded,p:DWORD;
    begin
    p :=DWORD(ListBox1.Items.Objects[ListBox1.itemindex]);
    h := OpenProcess(PROCESS_ALL_ACCESS, false, p);     //p 为 进程ID
    if h > 0 then
    begin
    if EnumProcessModules( h, @hMod, sizeof(hMod), cbNeeded) then
    begin
        SetLength(fileName, MAX_PATH);
        iLen := GetModuleFileNameEx(h, hMod, PCHAR(fileName), MAX_PATH);
        if iLen <> 0 then
        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[ListBox1.ItemIndex];
    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[ListBox1.ItemIndex];
    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
        if h > 0 then
        begin
          if EnumProcessModules( h, @hMod, sizeof(hMod), cbNeeded) then
          begin
          SetLength(fileName, MAX_PATH);
          iLen := GetModuleFileNameEx(h, hMod, PCHAR(fileName), MAX_PATH);
          if iLen <> 0 then
          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;

  • 相关阅读:
    在Delphi中使用indy SMTP发送gmail邮件[转]
    Delphi APP 開發入門(四)簡易手電筒
    Delphi APP 開發入門(六)Object Pascal 語法初探
    Delphi APP 開發入門(五)GPS 定位功能
    Delphi APP 開發入門(十)REST Client 開發
    Delphi APP 開發入門(九)拍照與分享
    各种电平的理解
    串口调试
    DSP中-stack和-heap的作用
    不同深度的图片转换cvConvertScale
  • 原文地址:https://www.cnblogs.com/key-ok/p/4594676.html
Copyright © 2020-2023  润新知