CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

怎样让程序只运行一次

楼主13023600339()2000-10-24 09:19:00 在 Delphi / VCL组件开发及应用 提问

我想让我的程序只执行一次,当程序正在运行时如果用户想运行此程序的复本时将弹出一个提示框,然后将复本关闭,如何实现此功能,请各位赐教 问题点数:50、回复次数:38Top

1 楼zyb()回复于 2000-10-24 09:42:00 得分 0

到已解决问题中去找,方法有好几种呢。。。Top

2 楼meijg(星星之火)回复于 2000-10-24 10:22:00 得分 0

用原子功能,atom  
  Top

3 楼LaoZheng(阿明)回复于 2000-10-24 10:50:00 得分 0

用findwindow()函数Top

4 楼13023600339()回复于 2000-10-24 11:20:00 得分 0

请各位具体一点Top

5 楼Nicrosoft(奈软)回复于 2000-10-24 12:42:00 得分 0

用findwindow()函数查找是否有某标题的窗口(即上一个实例的窗口)存在,如果存在则Application.Terminate.Top

6 楼Nicrosoft(奈软)回复于 2000-10-24 12:48:00 得分 0

用findwindow()函数查找是否有某标题的窗口(即上一个实例的窗口)存在,如果存在则Application.Terminate.Top

7 楼PoolD(池龙)回复于 2000-10-24 12:59:00 得分 0

一般用两种方法实现。  
  1.   用findwindow函数根据窗口的标题和类名查找程序的主窗口是否存在。  
        如在dpr中,建立主窗口之前  
            if   findwindow('tform1',   'form1')   =   0   then    
                //建立主窗口并运行程序  
        但是  
  2.   用CreateMutex函数建立一个互斥量。  
        如在dpr中  
            CreateMutex(0,   true,   'my   program');  
            if   GetLastError   <>   ERROR_ALREADY_EXISTS   then   begin  
                Application.Initialize;  
                Application.CreateForm(TfMain,   fMain);  
                Application.Run;  
            end;  
   
  我个人认为用CreateMutex的方法比较好。用findwindow的话在调试的时候会有一些麻烦。Top

8 楼mantousoft(孜孜)回复于 2000-10-24 13:06:00 得分 50

修改dpr文件,下面是我以前编的一个程序,看看对你有没有帮助。  
  program   onlyone;  
   
  uses  
      Forms,  
      Windows,  
      main   in   'main.pas'   {Form1};  
   
  {$R   *.RES}  
   
  var  
            MutexHandle:   THandle;  
            hPrevInst:   Boolean;  
   
  begin  
            //检查互斥句炳名  
    MutexHandle   :=   CreateMutex(nil,   TRUE,   'MysampleAppMutex');  
    if   MutexHandle   <>   0   then  
      begin  
                      if   GetLastError   =   ERROR_ALREADY_EXISTS   then  
                      begin  
                                MessageBox(0,   'Instance   of   this   application   is   already   running.',  
                                                            'Application   already   running',   mb_IconHand);  
   
                hPrevInst   :=   TRUE;  
                    CloseHandle(MutexHandle);  
                                Halt;   //   'Halt'   退出  
                      end  
                  else  
                              begin  
                                      //没找到  
                                        hPrevInst   :=   FALSE;  
                              end;  
        end  
            else  
                    begin  
                            hPrevInst   :=   FALSE;  
                    end;  
   
      Application.Initialize;  
      Application.Title   :=   'My   sample   app';  
      Application.CreateForm(TForm1,   Form1);  
      Application.Run;  
  end.Top

9 楼mantousoft(孜孜)回复于 2000-10-24 13:10:00 得分 0

修改dpr文件,下面是我的一个例子程序  
  program   tool;  
   
  uses  
      Forms,  
      windows,  
      main   in   'main.pas'   {mainform},  
      setit   in   'setit.pas'   {setform},  
      about   in   'about.pas'   {aboutForm};  
   
  {$R   *.RES}  
  var  
            MutexHandle:   THandle;   //定义互斥句柄  
  //防止二次运行  
  begin  
      //   whether   existed  
      MutexHandle   :=   CreateMutex(nil,   TRUE,   'My   toolbar');  
      if   MutexHandle   <>   0   then  
      begin  
          if   GetLastError   =   ERROR_ALREADY_EXISTS   then  
          begin  
              MessageBox(0,   '程序已经运行...',  
                                    '不好意思',   mb_IconHand);  
              CloseHandle(MutexHandle);  
              Halt;   //   'Halt'   Is   stop   running   the   actual   application.  
          end;  
      end;  
      Application.Initialize;  
      Application.Title   :=   'My   toolbar';  
      Application.CreateForm(Tmainform,   mainform);  
      Application.CreateForm(Tsetform,   setform);  
      Application.CreateForm(TaboutForm,   aboutForm);  
      Application.Run;  
  end.  
  Top

10 楼mantousoft(孜孜)回复于 2000-10-24 13:15:00 得分 0

修改dpr文件,下面是我的一个例子程序  
  program   tool;  
  uses  
      Forms,  
      windows,  
      main   in   'main.pas'   {mainform},  
      setit   in   'setit.pas'   {setform},  
      about   in   'about.pas'   {aboutForm};  
  {$R   *.RES}  
  var  
            MutexHandle:   THandle;   //定义互斥句柄  
  //防止二次运行  
  begin  
      //   whether   existed  
      MutexHandle   :=   CreateMutex(nil,   TRUE,   'My   toolbar');  
      if   MutexHandle   <>   0   then  
      begin  
          if   GetLastError   =   ERROR_ALREADY_EXISTS   then  
          begin  
              MessageBox(0,   '程序已经运行...',  
                                    '不好意思',   mb_IconHand);  
              CloseHandle(MutexHandle);  
              Halt;   //   'Halt'   Is   stop   running   the   actual   application.  
          end;  
      end;  
      Application.Initialize;  
      Application.Title   :=   'My   toolbar';  
      Application.CreateForm(Tmainform,   mainform);  
      Application.CreateForm(Tsetform,   setform);  
      Application.CreateForm(TaboutForm,   aboutForm);  
      Application.Run;  
  end.Top

11 楼PoolD(池龙)回复于 2000-10-24 13:34:00 得分 0

一般用两种方法实现。  
  1.   用findwindow函数根据窗口的标题和类名查找程序的主窗口是否存在。  
        如在dpr中,建立主窗口之前  
            if   findwindow('tform1',   'form1')   =   0   then    
                //建立主窗口并运行程序  
        但是  
  2.   用CreateMutex函数建立一个互斥量。  
        如在dpr中  
            CreateMutex(0,   true,   'my   program');  
            if   GetLastError   <>   ERROR_ALREADY_EXISTS   then   begin  
                Application.Initialize;  
                Application.CreateForm(TfMain,   fMain);  
                Application.Run;  
            end;  
   
  我个人认为用CreateMutex的方法比较好。用findwindow的话在调试的时候会有一些麻烦。Top

12 楼PoolD(池龙)回复于 2000-10-24 13:57:00 得分 0

一般用两种方法实现。  
  1.   用findwindow函数根据窗口的标题和类名查找程序的主窗口是否存在。  
        如在dpr中,建立主窗口之前  
            if   findwindow('tform1',   'form1')   =   0   then    
                //建立主窗口并运行程序  
  Top

13 楼PoolD(池龙)回复于 2000-10-24 14:00:00 得分 0

一般用两种方法实现。  
  1.   用findwindow函数根据窗口的标题和类名查找程序的主窗口是否存在。  
        如在dpr中,建立主窗口之前  
            if   findwindow('tform1',   'form1')   =   0   then    
                //建立主窗口并运行程序  
  2.   用CreateMutex函数建立一个互斥量。  
        如在dpr中  
            CreateMutex(0,   true,   'my   program');  
            if   GetLastError   <>   ERROR_ALREADY_EXISTS   then   begin  
                Application.Initialize;  
                Application.CreateForm(TfMain,   fMain);  
                Application.Run;  
            end;  
   
  我个人认为用CreateMutex的方法比较好。用findwindow的话在调试的时候会有一些麻烦。Top

14 楼FamelStudio(Famel)回复于 2000-10-24 14:16:00 得分 0

· 使用RegisterWindowMessage注册一个用户自定义消息,在程序的主窗口消息处理函数中响应该消息。  
  · 在程序启动时,使用EnumWindows枚举所有的顶层窗口,并向每个窗口发送(使用SendMessage)那个自定义消息并检查返回结果。Windows的缺省消息处理函数对于自定义消息返回0。  
   
  该方法的优点是非常精确,不会出现错误。RegisterWindowMessage确保你所注册的消息的唯一性。同时你可以注册多个自定义消息来执行其他功能,如使用正在运行的程序拷贝来打开用户双击的文件等。  
  Top

15 楼Raptor(猛禽)回复于 2000-10-24 14:16:00 得分 0

方法多了,MUTEX也是一种Top

16 楼Raptor(猛禽)回复于 2000-10-24 14:28:00 得分 0

方法多了,MUTEX也是一种Top

17 楼solomon(金矿)回复于 2000-10-25 09:31:00 得分 0

HANDLE hMutex;  
   
  //   Only   one   instance   allowed  
  hMutex   =   CreateMutex(NULL,   TRUE,   "Any   String");  
  if(   hMutex   ==   NULL   )  
  {  
      //System   Error   return    
  }  
  else  
  {  
      if(   !(GetLastError()   ==   ERROR_ALREADY_EXISTS   &&   hMutex   !=   NULL)   )  
      //   One   Instance   is   running   just   return  
  }  
  Top

18 楼ping1999(ping)回复于 2000-10-25 15:26:00 得分 0

Public   Declare   Function   FindWindow   Lib   "user32"   Alias   "FindWindowA"   (ByVal   lpClassName   As   String,   ByVal   lpWindowName   As   String)   As   Long  
  Top

19 楼nirvana()回复于 2000-10-26 13:32:00 得分 0

可以用同步机制中的信号灯,在程序启动时创建一个有名字的信号灯,如果返回说系统中已经有这个名字的信号灯则该程序已经被启动了。  
  或者用窗口类,将你的主窗口命名一个特殊的窗口类名,然后用ENUMWINDOW找是否系统中已经有这个名字的窗口类Top

20 楼optman(optman)回复于 2000-10-30 21:18:00 得分 0

你可以建立一个有名字的   Event对象,好像是CreateEvent()  
  因为无法建立同名的Event,所以第二个实例会建立失败......  
   
  这是<<Windows核心编程>>里使用的办法Top

21 楼jxabe(沙丁鱼)回复于 2000-10-30 21:49:00 得分 0

其实这个问题很简单,只要我们给Application.title付一个值,如test,然后当你的程序在开始运行时用GetWindowHandle获得句柄,检查是不是和test相同,如果没有相同的就可以继续运行,相同当然就是弹出对话框,但我觉得这没什么必要,只要让它不继续运行就行了嘛.就象winamp,如果每次都要弹出对话框那多烦.Top

相关问题

  • 怎样让VB程序只运行一个程序实例呢
  • 怎样让我的MFC程序只能运行一个实例?
  • 怎样才让应用程序只能运行一次?
  • 怎样使VB程序只允许运行一个例程?
  • 怎样使应用程序只运行一次
  • 怎样让一个程序只在后台运行?
  • 怎样使程序只运行一个实例
  • 请问怎样让一个程序只运行一个,再次运行时激活将以运行的程序显示为当前窗口?
  • 怎样保存程序运行结果?
  • 怎样编译但不运行程序?

关键词

  • 函数
  • application
  • 信号灯
  • mutexhandle
  • createmutex
  • 运行
  • 程序
  • findwindow
  • createform
  • 互斥

得分解答快速导航

  • 帖主:13023600339
  • mantousoft

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo