我做的程序,如何制作判断自身程序已运行.防止软件被打开两次.
我明白用findwindows来找标题.我找到了程序已运行,但是关闭不了呢?用end的话,软件仍然要被打开第二次,但是没有菜单,也不能正常使用,用unload又会弹出那个我自已做的是否关闭程序对话框.有办法检测到自已已经在运行中,然后提示一下就结束吗?除了用end和unload以外还有什么办法.我指关闭程序.

解决方案 »

  1.   

    If App.PrevInstance Then
        MsgBox "已经运行!", vbInformation
        End
    End If
      

  2.   

    用  App.PrevInstance  判断
      

  3.   

    Leftie 的方法是正解。用App.PrevInstance来判断是最好的方法了。
      

  4.   

    谢谢楼上几位.我知道怎么查找程序本身是否运行.我遇到的问题是,怎么退出,我现在情况是,即使发现了程序在运行中,软件还是会被打开第二次.代码如下:
    Private Sub Form_Load()
              If App.PrevInstance Then
                      iii = MsgBox("该软件已在运行中,请确认是否被最小化到右下角任务栏!", vbExclamation, "提示")                  End
                      DoEvents
                    Exit Sub          End If
    .............................
    end sub问题出在这个end上,它不能有效的结束程序,该程序仍然会被打开.只是没有菜单了.就说明窗体被装载了一半.怎么的语句才能使程序彻底结束.我的程序有两个窗体.主窗体form1 另一个窗体form2
      

  5.   

    用unload me也不行.unload me 会触发form1_unload()会出现提示是否确认退出程序.这是我自已写的代码.
      

  6.   

    加一个变量 判断 是不是 由于 2次关闭 被Unload 的
      

  7.   

    问题出在这个end上,它不能有效的结束程序,该程序仍然会被打开.只是没有菜单了.就说明窗体被装载了一半.怎么的语句才能使程序彻底结束.我的程序有两个窗体.主窗体form1 另一个窗体form2        
    ///////////////////////////////////
    Private Sub Form_Load()
       If App.PrevInstance Then
          MsgBox("该软件已在运行中!",vbExclamation, "提示")
            Unload form1
            Unload form2
       End If
    End Sub
      

  8.   

    Private Sub Form_Load()//别在这里写新建一个模块,写个Sub Main,在那里面判断 这样,窗体根本就不会被加载.
      

  9.   

    防止退出对话框代码如下Private Sub Form_Load()
        If App.PrevInstance Then
            Unload Me
        End If
    End SubPrivate Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
        If UnloadMode = vbFormControlMenu Then
            If MsgBox("是否退出?", vbQuestion + vbYesNo) = vbNo Then
                Cancel = True
            End If
        End If
    End Sub
      

  10.   

    直接画面启动是不好的习惯
    你加个模块
    里面来个 sub main然后在sub main 里加上
        If App.PrevInstance = True Then
            End
        End If再让工程从sub main 启动
    问题就解决了
      

  11.   

    myjian和beal_p正解,我一直在用!!!但这个方法在.net已经不行了!!最近打算把VB代码移植到VB.NET,打印部分差不多要全部重写,汗!!!
      

  12.   

    如果一定不用MAIN,我想你是不是可以加一个TIMER控件,将END放入该TIMER事件中,有原来用END的地方,用TIMER.ENABLED=TRUE代替。
      

  13.   

    一是用main()启动判断代码写在这里,一是要生成exe文件
      

  14.   

    复制一个,再改个名字又可以运行了,LZ不就白忙了...要是向操作系统申请产生一个系统的互斥变量就好了,比如用下CreateMutex之类的函数.
      

  15.   

    说起来.....前几天传了一个上去:使用互斥体实现的禁止多实例运行http://www.m5home.com/blog/blogview.asp?logID=466
    http://m5home.vicp.net/blog/blogview.asp?logID=466