我看到有一些软件:软件已经启动了!再次点这运行这个软件时,不是第二次打开,而是把第一次运行的窗口显示出来,这是怎么做到的? 请贴代码,谢谢!!

解决方案 »

  1.   

    If App.PrevInstance Then '如果程序已经被打开就退出
        Unload Me
    Else
    endif
      

  2.   

    大哥们,使用App.PrevInstance 去监测我知道啊,问题如何调出已在运行的程序啊?
      

  3.   

    用FindWindow函数找到自己的程序的窗口,获得句柄,然后调用ShowWindow或者其他函数显示出自己的程序
      

  4.   

    FindWindow VB声明 
    Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long 
    说明 
    寻找窗口列表中第一个符合指定条件的顶级窗口(在vb里使用:FindWindow最常见的一个用途是获得ThunderRTMain类的隐藏窗口的句柄;该类是所有运行中vb执行程序的一部分。获得句柄后,可用api函数GetWindowText取得这个窗口的名称;该名也是应用程序的标题) 
    返回值 
    Long,找到窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError 
    参数表 
    参数 类型及说明 
    lpClassName String,指向包含了窗口类名的空中止(C语言)字串的指针;或设为零,表示接收任何类 
    lpWindowName String,指向包含了窗口文本(或标签)的空中止(C语言)字串的指针;或设为零,表示接收任何窗口标题 
    注解 
    很少要求同时按类与窗口名搜索。为向自己不准备参数传递一个零,最简便的办法是传递vbNullString常数
     
    示例 
    Dim hw&, cnt&
    Dim rttitle As String * 256
    hw& = FindWindow("ThunderRT5Main", vbNullString) ' ThunderRTMain under VB4
    cnt = GetWindowText(hw&, rttitle, 255)
    MsgBox Left$(rttitle, cnt), 0, "RTMain title" ShowWindow VB声明 
    Declare Function ShowWindow Lib "user32" Alias "ShowWindow" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long 
    说明 
    控制窗口的可见性(在vb里使用:针对vb窗体及控件,请使用对应的vb属性) 
    返回值 
    Long,如窗口之前是可见的,则返回TRUE(非零),否则返回FALSE(零) 
    参数表 
    参数 类型及说明 
    hwnd Long,窗口句柄,要向这个窗口应用由nCmdShow指定的命令 
    nCmdShow Long,为窗口指定可视性方面的一个命令。请用下述任何一个常数 
    SW_HIDE 隐藏窗口,活动状态给令一个窗口 
    SW_MINIMIZE 最小化窗口,活动状态给令一个窗口 
    SW_RESTORE 用原来的大小和位置显示一个窗口,同时令其进入活动状态 
    SW_SHOW 用当前的大小和位置显示一个窗口,同时令其进入活动状态 
    SW_SHOWMAXIMIZED 最大化窗口,并将其激活 
    SW_SHOWMINIMIZED 最小化窗口,并将其激活 
    SW_SHOWMINNOACTIVE 最小化一个窗口,同时不改变活动窗口 
    SW_SHOWNA 用当前的大小和位置显示一个窗口,不改变活动窗口 
    SW_SHOWNOACTIVATE 用最近的大小和位置显示一个窗口,同时不改变活动窗口 
    SW_SHOWNORMAL 与SW_RESTORE相同 SetForegroundWindow VB声明 
    Declare Function SetForegroundWindow Lib "user32" Alias "SetForegroundWindow" (ByVal hwnd As Long) As Long 
    说明 
    将窗口设为系统的前台窗口。这个函数可用于改变用户目前正在操作的应用程序 
    返回值 
    Long,非零表示成功,零表示失败。会设置GetLastError 
    参数表 
    参数 类型及说明 
    hwnd Long,带到前台的窗口 
    注解 
    不应随便使用它,因为一旦程序突然从后台进入前台,可能会使用户产生迷惑
      

  5.   

    使用DDE来实现这一功能的示例代码:Option Explicit'程序名称:DDE Demo
    '代码设计:Jadeluo
    '设计日期:2001/03/05
    '功能说明:用于演示如何通过DDE的方法来防止一个程序被运行两次
    '          同时还演示了在第二次运行时将一些参数传递给已运行的程序的功能'在设计时,窗体的LinkTopic被设置成了"DDE", 工程名称被设置成了"DDEDemo"
    '窗体上有一个Label控件, 名为lblRunning
    '窗体上还有两个TextBox控件, 名为txtServer和txtClientPrivate Sub Form_Load()
        Dim FirstRun As Boolean
        '暂停本程序的DDE Server
        Me.LinkMode = 0
        '尝试连接已运行的DDE Demo
        txtClient.LinkMode = 0
        txtClient.LinkTopic = "DDEDemo|DDE"
        txtClient.LinkItem = "txtServer"
        On Error Resume Next
        txtClient.LinkMode = 1
        FirstRun = Err.Number <> 0
        On Error GoTo 0
        If FirstRun Then
            '这是第一次运行DDE Demo
            '打开本程序的DDE Server,用于被以后运行的DDE Demo连接
            Me.LinkMode = 1
            lblRunning.Caption = "DDE Demo started..."
        Else
            '产生一个随机数作为这次运行的ID
            Randomize
            txtClient.Text = Int(Rnd * 1000)
            '将ID传递给已运行的DDE Demo
            txtClient.LinkPoke
            '结束本次运行
            End
        End If
    End SubPrivate Sub txtServer_Change()
        '有其他DDE Demo运行了,传递来的是这些DDE Demo的ID
        lblRunning.Caption = lblRunning.Caption & vbCrLf & "Another DDE Demo ID:" & _
                             txtServer.Text
        Me.WindowState = 0
        Me.Show
    End Sub
      

  6.   

    楼上的代码有问题Me.LinkMode = 0不能在运行时设置!!
      

  7.   

    我明白了,还应该把Me.LinkMode 在设计时设成1,这样就行了!
    这个方法的确不错!!谢谢!!