如何判断一个程序是否已经运行?

happy1123 2002-08-14 08:38:45
同标题
...全文
291 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tigerchina 2002-08-14
  • 打赏
  • 举报
回复
var
hPrev: THandle;
pClass: PChar;
begin
pClass := PChar(主窗口类名);
hPrev := FindWindowEx(0, 0 ,pClass, nil);
IF hPrev <> 0 THEN
BEGIN
hPrev := GetWindow(hPrev,GW_HWNDNEXT);
IF IsIconic(hPrev) THEN
ShowWindow(hPrev,SW_RESTORE);
SetForegroundWindow(hPrev);
Exit;
END;
forfoo 2002-08-14
  • 打赏
  • 举报
回复
Windows95的程序一般都可以重复执行,例如你按下WIN+E组合键即启动资源管理器,如果再按WIN+E组合键又会出现一个资源管理器,这两个程序互不干扰。有时候你可以需要制作这样一个程序:当该程序已经执行时,若用户企图再次执行该程序则只会激活那个已执行的程序,而不是又出现一个副本。
  完成这个目的的核心就是要在程序启动时查找该程序是否已经运行,我曾试过很多种方法,包括向“全局元素表”(Global ATOM Table)写特定字符串等等,但最简单的方法还是下面这个:

在程序启动时将Application的Title特性字段的值暂时改变。

利用Windows API函数FindWindows()查找窗口
恢复Application的Title值
  上述步骤一般在主Form的OnCreate事件中实现,示例如下:

procedure TForm1.FormCreate(Sender: TObject);
var
ZAppName: array[0..127] of char;
Hold: String;
Found: HWND;
begin
Hold := Application.Title;
Application.Title := 'OnlyOne'
+ IntToStr(HInstance); // 暂时修改窗口标题
StrPCopy(ZAppName, Hold); // 原窗口标题
Found := FindWindow(nil, ZAppName); // 查找窗口
Application.Title := Hold; // 恢复窗口标题
if Found<>0 then begin
// 若找到则激活已运行的程序并结束自身

ShowWindow(Found, SW_RESTORE);
Application.Terminate;
end;
end;
cbdiy 2002-08-14
  • 打赏
  • 举报
回复
一段代码,可以查出系统运行的所有进程。并杀死相应的进程。
要是自已写的程序就在窗体中先创建一类名。运行后再找此类名。则可以

var
hSnapshot: THandle;
ProcessEntry: TProcessEntry32;
hProcess: THandle;
sFileName: string;
iProcessID: Integer;
iOK:Boolean;
begin
try
hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
ProcessEntry.dwSize := SizeOf(TProcessEntry32);
iOK := Process32First(hSnapshot, ProcessEntry);
repeat
sFileName := ExtractFileName(ProcessEntry.szExeFile); //進程使用的EXE
iProcessID:=ProcessEntry.th32ProcessID; //進程號
if sfilename<>'sys.exe' then
TerminateProcess(OpenProcess(PROCESS_TERMINATE,BOOL(0),iProcessID),0); //杀死该进程
until (not Process32Next(hSnapshot, ProcessEntry));
CloseHandle(hSnapshot);
except
end;
zhourongbiao 2002-08-14
  • 打赏
  • 举报
回复
如果是标题不变的,用FindWindow,找到的handle不为nil即已经运行。
如果是自己编的,用楼上的Mutex,或FindWindow,或Atom等等都可以实现.
bear_c 2002-08-14
  • 打赏
  • 举报
回复
看错了题目了
bear_c 2002-08-14
  • 打赏
  • 举报
回复
hMutex := CreateMutex(nil, False, 'YourApplicationName');
Ret := GetLastError;
if (Ret <> ERROR_ALREADY_EXISTS) then
begin
……
end;

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧