请问怎么检测一个应用程序是否已经运行? 我已搜索以前的帖子,回答的都比较模糊。(50分)

  • 主题发起人 主题发起人 mysec
  • 开始时间 开始时间
在DPR里面写
Var
hMutex : hWnd;
Ret : integer;
begin
Application.Initialize;
hMutex:=CreateMutex(NIL,False,'my project');
Ret:=GetLastError;
IF Ret<>ERROR_ALREADY_EXISTS then
begin
你的代码
end;
Application.MessageBox('已经运行了');
end.
 
我没说清楚,我是想在一个项目中检测此时另外一个指定的程序是否已经运行,
例如Foxmail.exe,如果已运行就执行一段代码,否则执行另一段
 
一样的啊!我的代码就是检查project名字为'my project'的程序是否再运行
 
var
pe:PROCESSENTRY32;
me:MODULEENTRY32;
hp,hm:Thandle;
b,b1:boolean;
begin
hp:=CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS,0);
pe.dwSize:=SizeOf(pe);
b:=Process32First(hp,pe);
while bdo
begin
hm:=CreateToolHelp32SnapShot(TH32CS_SNAPModule,pe.th32ProcessID);
me.dwSize:=sizeof(ModuleEntry32);
if Module32First(hm,me) then
begin
b1:=Module32First(hm,me);
while b1do
begin
// if me.th32ModuleID=pe.th32ModuleID then
listbox1.Items.Add(copy(me.szExePath,length(extractfilepath(me.szExePath))+1,length(me.szExePath)-length(extractfilepath(me.szExePath))));
//移到路径只要文件名;
b1:=Module32Next(hm,me);
end;
end;
b:=Process32Next(hp,pe);
end;

这段代码可以列出当前所有在运行的EXE文件和DLL文件;
你在LISTBOX1中查找是否有你想要查找的文件(如DELPHI32.EXE),用一个循环就可搞定;
for i:=0 to listbox1.items.count-1do
begin
if listbox1.items='delphi32.exe' then
begin
存在,执行存在代码;
break;
end
else
不存在;
end;
 
to luyear;
我没有用 Application.Initialize,而是通过点击按钮来判断当前指定的程序是否
在运行,出现了这种情况:
1.检测一个当前尚未运行的程序
点击第一次没报告‘已运行’ ,再点一次时却报告‘已运行’,在末尾加上
ReleaseMutex(hMutex) 或 hMutex:=0 都没有用;
2.检测一个当前已运行的程序
点击第一次报告‘已运行’,然后手工退出该被检测程序,再点击时还是报
告‘已运行’!
请教!
to nsj;
您的PROCESSENTRY32、MODULEENTRY32等等是包含在哪个pas里的啊?
 
var
hCurWindow: HWnd;
// 窗口句柄
WinText: array [0..255] of char;
s:string;
begin
s:='';
// 获取第一个窗口的句柄
hCurWindow := GetWindow(Handle, GW_HWNDFIRST);
while hCurWindow <> 0do
begin
// 获取窗口的名称
if GetWindowText(hCurWindow, @WinText, 255)>0 then
s:=s+StrPas(@WinText)+#10;
// 获取下一个窗口的句柄
hCurWindow:=GetWindow(hCurWindow, GW_HWNDNEXT);
end;
s 中即为所有正在运行的程序。
 
用 findwindow 查找 你要判断的程序的 窗口句柄 啊 找到 就执行1、没有就执行2、嘛
 
to dingbaosheng:
用findwindow,如何获得指定程序的相应参数?
例如foxmail.exe, 怎么得到foxmail.exe的类名,又怎么得到
它的标题名呢(可能在编辑信件,也可能在收信)
 
我又试了一下,foxmail可以找到,但xdict等就不行了
找foxmail时不必指定类名,但xdict?
 
大侠现身!
 
1、可以在注册表里做标记!退出时在删掉。
2、创建全局原子(API):
GobalAddAtom;GlobalFindAtom;GlobalDeleteAtom;
ATOM glodalAddAtom(LPCTSTR lpsring);
.......
 
非常简单啊,尝试一下文件删除或者改名就行了,如果.exe没有运行则可以删除,否则不能删除。
框架如下:
function EXERuning(FileName: TFileName): boolean;
begin
try
filerename(filename,"zzzz.exe")
filerename("zzzz.exe",filename)
result := false
except
result := true
end;

end;
 
你搜索一下就知道了。
 
多人接受答案了。
 
后退
顶部