荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Peter (小飞侠), 信区: Program
标  题: 防止程序被重复执行(转载)
发信站: BBS 荔园晨风站 (Thu Jan 21 21:10:06 1999), 转信


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;
                        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;



  用该算法制作的构件请到“Delphi构件”页下载。

--
※ 来源:.BBS 荔园晨风站 bbs.szu.edu.cn.[FROM: 192.168.1.3]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店