+ -
当前位置:首页 → 问答吧 → 怎么判断exe是否被打开

怎么判断exe是否被打开

时间:2011-08-18

来源:互联网

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

作者: syt201314   发布时间: 2011-08-18

引用楼主 syt201314 的回复:
怎么判断 c:\aa.exe
是否被打开?

按照其名称在进程中搜句柄,如果存在就已经打开。如果说,你要保证这个程序永远只有一个实例运行,可以采用在工程文件中尝试创建一个互斥变量,然后检测该互斥变量的句柄是否已经存在,如果已经存在,就直接退出。

作者: rainychan2009   发布时间: 2011-08-18

代码如下

// 获取系统当前进程名和进程ID,
//注:应引用"TLHelp32"单元"use TLHelp32"。
unit Unit2;

interface

uses
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.

作者: funxu   发布时间: 2011-08-18

能被删除的,肯定是没打开着的

作者: sz_haitao   发布时间: 2011-08-18

就是根据 进程 来提供句柄

作者: sgzhou12345   发布时间: 2011-08-18

3L方法强悍.................

作者: funxu   发布时间: 2011-08-18

占位置继续学习中...........

作者: sgzhou12345   发布时间: 2011-08-18

看看进程中是否有它 ?

作者: cai5   发布时间: 2011-08-18

热门下载

更多