function IsFileInUseEx(FileName:string):Boolean; var hFileRes: HFILE; FileAttr: Integer; begin Result := False; FileAttr := GetFileAttributes(Pchar(FileName)); if (FileAttr mod 2) = 1 then SetFileAttributes(Pchar(FileName),0); hFileRes := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0,nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); Try Result := (hFileRes = INVALID_HANDLE_VALUE); if FileAttr <> 0 then SetFileAttributes(Pchar(FileName),FileAttr); Finally CloseHandle(hFileRes); End; end;
在某些情况下,我们编写的应用程序同时只能有一个实例在内存中运行,例如服务器程序、需要独占某设备的程序,甚至我们仅仅是让程序同时只有一个实例运行(如UltraEdit就是这样做的,让你不能同时运行多个UltraEdit)。要实现此功能,需要在程序中加一点判断的代码,程序如下:
按Ctrl+F12键,选择Project1,加入下列语句
program Project1;
uses
windows, {加入该句才能调用函数}
Forms,
Unit1 in 'Unit1.pas'{Form1};
{$R *.RES}const classname='TFormScreen'; {声明为主窗体的类名}
var handle:integer; {变量}
begin
{-----------------主要为该判断部分----------------------}
handle:=findwindow(classname,nil);{查找是否有此类的窗体}
if handle<>0 then {不为0则程序已运行}
begin
messagebox(0,'该程序已经有一个在运行中!','运行',0);{提示程序已运行}
ShowWindow(handle, SW_Show); {显示程序}
SetForegroundWindow(handle); {激活程序}
halt; {退出程序}
end;
{------------------------------------------------------}
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
我不是自己编写的程序,是想编写一个程序来查找其他的某一个程序是否在运行,这个其他的程序标题不固定,md5也不固定,但是是同一个程序,在详细点就是
有一个程序A.exe,这个不是我编写的,是下载的程序
这个程序A.exe标题是“aaa”,通过汉化工具修改A.exe的标题为”bbb“后,然后存储为B.exe
我想编写个程序 不论是a.exe还是b.exe运行,都能判断检测出来
这次应该写明白我的意思了吧
既然标题变了,那么你可以通过“类名”来枚举窗口,类名不会变,如果通过类名找到的窗口不唯一,也就是说也有相同类名的其他的进程,那么你可以再通过找每个exe的Z序特征来确定哪个是A.exe和B.exe,Z序特征肯定可以达到你的要求。
方法有很多,比如做个MD5表对比。再或者,找EXE的特征码(我曾经做过一个类似的功能,我采用PE文件的编译时间作为特征码)
再或者查看EXE相对路径的某些文件是否存在,如果存在,则认为是指定的EXE正在运行
比如QQ.exe同目录下有IM.dll和ABL.sys等文件。其他方法还有很多不一一举例,都能满足你的目的
var
hFileRes: HFILE;
FileAttr: Integer;
begin
Result := False;
FileAttr := GetFileAttributes(Pchar(FileName));
if (FileAttr mod 2) = 1 then SetFileAttributes(Pchar(FileName),0);
hFileRes := CreateFile(PChar(FileName), GENERIC_READ or GENERIC_WRITE, 0,nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
Try
Result := (hFileRes = INVALID_HANDLE_VALUE);
if FileAttr <> 0 then SetFileAttributes(Pchar(FileName),FileAttr);
Finally
CloseHandle(hFileRes);
End;
end;