怎么判断 c:\aa.exe
是否被打开?

解决方案 »

  1.   

    代码如下// 获取系统当前进程名和进程ID,
    //注:应引用"TLHelp32"单元"use TLHelp32"。
    unit Unit2;interfaceuses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ComCtrls, StdCtrls,TLHelp32;type
    TForm2 = class(TForm)
        ListBox1: TListBox;
        ListView1: TListView;
        Button1: TButton;
        Button2: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
    private
        { Private declarations }
    public
        { Public declarations }
    end;var
    Form2: TForm2;
    ContinueLoop:BOOL;       //是否继续循环
    FSnapshotHandle:THandle; //进程快照句柄
    FProcessEntry32:TProcessEntry32; //进程入口的结构体信息implementation{$R *.dfm}procedure TForm2.Button1Click(Sender: TObject);
    //在listview中显示进程
    var
    NewItem: TListItem;
    Summ:integer;
    begin
    ListView1.Items.BeginUpdate;
    ListView1.Items.Clear;
    FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    //CreateToolhelp32Snapshot函数得到进程快照
    FProcessEntry32.dwSize := Sizeof(FProcessEntry32); //初始化
    ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
    //Process32First 得到一个系统快照里第一个进程的信息
    Summ := 0;
    while ContinueLoop do
        begin
        Summ := Summ + 1;
        NewItem := ListView1.Items.Add;   //在ListView1显示
        NewItem.ImageIndex := -1;
        NewItem.Caption := ExtractFileName(FProcessEntry32.szExeFile); //进程名称
        //??NewItem.Caption := ExtractFilePath(FProcessEntry32.szExeFile);//进程名称
        NewItem.subItems.Add(FormatFloat('00', Summ));//序号
        NewItem.subItems.Add(IntToStr(FProcessEntry32.th32ProcessID));//进程ID
        ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
    end;
    CloseHandle(FSnapshotHandle);
    ListView1.Items.EndUpdate;Label1.Caption:='进程数:'+inttostr(ListView1.Items.Count);end;procedure TForm2.Button2Click(Sender: TObject);
    //在listbox中显示进程 id
    var
    ProcessName : string; //进程名
    ProcessID : integer; //进程表示符
    begin
    FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //创建一个进程快照
    FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
    ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32); //得到系统中第一个进程
    //循环例举
    while ContinueLoop do
    begin
        ProcessName := FProcessEntry32.szExeFile;
        ProcessID := FProcessEntry32.th32ProcessID;
        Listbox1.Items.add('应用程序名 :'+ProcessName +'#进程ID:'+ inttostr(ProcessID));
        ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
    end;
    end;procedure TForm2.FormCreate(Sender: TObject);begin
    //对ListView1的初始化
    ListView1.ViewStyle:=vsReport; //设置ListView的显示方式 不设置这种方式不显示列头
    ListView1.Columns.Add;       //添加第一列
    ListView1.Column[0].Caption:='进程名';
    ListView1.Column[0].AutoSize:=false;
    ListView1.Column[0].Width:=100;
    ListView1.Column[0].Alignment:=taLeftJustify;//左对齐
    ListView1.Columns.Add;       //添加第二列
    ListView1.Column[ListView1.Columns.Count-1].Caption:='序号';
    ListView1.Column[ListView1.Columns.Count-1].AutoSize:=true;
    ListView1.Column[ListView1.Columns.Count-1].Alignment:=taLeftJustify;//左对齐
    ListView1.Columns.Add;       //添加第三列
    ListView1.Column[ListView1.Columns.Count-1].Caption:='ID';
    ListView1.Column[ListView1.Columns.Count-1].AutoSize:=true;
    ListView1.Column[ListView1.Columns.Count-1].Alignment:=taLeftJustify;//左对齐end;
    end.
      

  2.   

    主要是查找进程
    CreateToolhelp32Snapshot 
      

  3.   

    句柄是一方面,另一方面你可以直接写入EXE,写入不成功就证明他正在运行
    不过这方法比较危险,一般不提倡使用
      

  4.   

    不是有个简单的API函数可以直接获得程序名字,返回就说明已经打开,找不到就说明没有打开,前提该程序最好取个特殊名字,避免和前提程序同名,不需要那么多代码
      

  5.   

    主要是查找进程
    CreateToolhelp32Snapshot
      

  6.   

    try
      删除之
      从回收站还原。
    except
      使用中
    end