If App.PrevInstance Then
        MsgBox "This application has been running", 64, "Attention"
End If我用上面的代码后,如果已经运行我可以知道但程序还会加载我不知道该如何避免,就是中断第二次的程序

解决方案 »

  1.   

    如何避免程式重复执行?
    (侦测是否存在前一副本,若有,则结束目前新启动的程式)使用者在启动程式后,有时会将程式缩小在工作列上,之后要用时,又会重新启动一次程式,资料库程式有时会因此造成资料错乱!若您不希望使用者重复启动程式,您可以使用 APP 物件来判断,方法如下:Private Sub Form_Load()
    If App.PrevInstance Then '检视前一版本
    MsgBox "此程式已经在执行中!", 48
    End
    End If
    End Sub
      

  2.   

    最好不要用END
    使用Unload Me退出主窗口比较安全。
      

  3.   

    首先使用findwindow看看你的副本有没有在运行,如果有则在窗体启动的时候,unload me。注意,findwindow需要你的副本程序有窗体的!
      

  4.   

    Private Sub Form_Load()
    If App.PrevInstance Then 
      End
    End If
    End Sub
    ///////////////////////////////////////
    End是结束应用程序,unload me只是卸载窗体
      

  5.   

    你寫的程式沒有錯,但是你放錯了事件,因為Form_Load()事件,還沒有加載完程式,所以判斷不出來,你將其放在Form_Activate()就可以了.
      

  6.   

    最好是
    If App.PrevInstance Then
            MsgBox "This application has been running", 64, "Attention"       end
    End If
    因為你的啟動程序可能會是從Main開始的
      

  7.   

    可以用DDE动态数据交换的方法实现
    打开VB,新建一个工程,选择菜单中的“工程->工程1 属性”,把工程名称改为“P1,把已有的一个窗体的“LinkTopic”属性改为“FormDDE”,把“LinkMode” 属性改为“1 - Source”,添加一个PictureBox控件作为DDE执行控件,命名为picDDE。然后添加一个 TextBox控件,命名为“txtInfo”,并把“MultiLine”属性设置为“True”,以便显示多行文本,作为消息显示控件最后在窗体代码区输入以下代码:Const COMMANDLINE = "CommandLine="       注释:  还是为了省事,定义一个常量 Private Sub Form_LinkExecute(CmdStr As String, Cancel As Integer) 
    Static lngCount As Long 
    Dim Info As String Info = txtInfo.Text     注释:      保留原有信息 Select Case CmdStr         注释:    CmdStr 是DDE程序传送过来的参数 
      Case "Max" 
        Me.WindowState = 2 
        Info = Info + vbNewLine + "窗体已被最大化" 
      Case "ShowTime" 
        Info = Info + vbNewLine + "最后一次运行这个程序的时间是:" + Str(Now) 
      Case "Count" 
        lngCount = lngCount + 1 
        Info = Info + vbNewLine + "你已经第" + Str(lngCount) + "次重复调用这个程序。" _ 
                + vbNewLine + "但怕您不多给工资,所以只运行了一个 ^_^" 
    End Select If Left(CmdStr, Len(COMMANDLINE)) = COMMANDLINE Then 
      Info = Info + vbNewLine + "新程序曾以命令行形式运行" + vbNewLine + "命令行为:" _ 
             + vbNewLine + Right(CmdStr, Len(CmdStr) - Len(COMMANDLINE)) 
    End If txtInfo.Text = Info     注释:    把信息显示出来 Cancel = False      
    End Sub 
    Private Sub LinkAndSendMessage(ByVal Msg As String) 
    Dim t As Long 
    picDDE.LinkMode = 0               注释:-- 
    picDDE.LinkTopic = "P1|FormDDE"   注释:  |______连接DDE程序并发送数据/参数 
    picDDE.LinkMode = 2               注释:  |      “|”为管道符,是“退格键”旁边的竖线, 
    picDDE.LinkExecute Msg            注释:--        不是字母或数字! t = picDDE.LinkTimeout     注释:-- 
    picDDE.LinkTimeout = 1     注释:  |______终止DDE通道。当然,也可以用别的方法 
    picDDE.LinkMode = 0        注释:  |      这里用的是超时强制终止的方法 
    picDDE.LinkTimeout = t     注释:-- 
    End Sub 
    Private Sub Form_Load() 
    If App.PrevInstance Then     注释: 程序是否已经运行   Me.LinkTopic = ""          注释: 这两行用于清除新运行的程序的DDE服务器属性, 
      Me.LinkMode = 0            注释: 否则在连接DDE程序时会出乱子的   LinkAndSendMessage "Max"          注释:-- 
      LinkAndSendMessage "Count"        注释:  |-----连接DDE接受程序并传送数据/参数 
      LinkAndSendMessage "ShowTime"     注释:--   If Command <> "" Then             注释: 如果有命令行参数,就传递过去 
         LinkAndSendMessage COMMANDLINE + Command     
      End If 
      End                               注释:  结束新程序的运行 
    End If 
    End Sub
      

  8.   

    测试一下: 
        把工程“P1”编译成EXE文件(设名称为 P1.EXE ) 
        1、打开“我的电脑”,找到 P1.EXE 并执行。可以看到程序正常运行了。 
        2、再运行一次,这次新程序没有运行成功,而原来运行的程序却被最大化了,而且文本框中有以下 
           字符: 窗体已被最大化 
    你已经第 1次重复调用这个程序。 
    但怕您不多给工资,所以只运行了一个 ^_^ 
    最后一次运行这个程序的时间是:00-2-6 7:11:01     3、打开 MS-DOS方式 ,用命令行方式再次运行程序,如 “P1 How Are You?” 
           这时原来运行的程序文本框中又多了几行字: 窗体已被最大化 
    你已经第 2次重复调用这个程序。 
    但怕您不多给工资,所以只运行了一个 ^_^ 
    最后一次运行这个程序的时间是:00-2-6 7:14:32 
    新程序曾以命令行形式运行 
    命令行为: 
    How Are You? OK,运行完全正确,然后你就可以把它应用的你的程序中了。 
      

  9.   

    呵呵, Kyle_Chen() 说的不错,最好不要直接用END结束,会造成资源泄漏,应该将所有的资源全释放,然后用UNLOAD