返回到一个已经打开的应用程序,当用户试图在VB6中打开一个新的实例(Return to an alr

2019-06-26 13:19发布

假设用户尽量减少我的Visual Basic应用程序的任务栏通知图标。 现在我想,当用户打开一个新的实例,老人们应该恢复。

Answer 1:

你经常可以做到这一点很简单地退化的方式使用DDE:

Form1.frm

Option Explicit
'This is Form1.  To use as DDE source at design time we set:
'   Form1.LinkMode = 1 (Source, i.e. vbLinkSource).
'   Form1.LinkTopic = "Form1" (default).
'
'Note we use (hidden) Label1 on this Form as a DDE destination.

Private PrevState As Integer

Private Sub Form_LinkExecute(CmdStr As String, Cancel As Integer)
    'Got a "command" so restore Form1 and accept the command.
    WindowState = PrevState
    Caption = "I am awake!"
    Cancel = False
End Sub

Private Sub Form_Load()
    PrevState = WindowState
End Sub

Private Sub Form_Resize()
    If WindowState <> vbMinimized Then PrevState = WindowState
End Sub

Module1.bas

Option Explicit

Private Sub Main()
    Load Form1
    'After Form1 is loaded (hidden), try DDE link to possible prior copy.
    With Form1.Label1
        .LinkTopic = App.EXEName & "|Form1"
        On Error Resume Next
        .LinkMode = vbLinkManual
        If Err.Number = 0 Then
            On Error GoTo 0
            'Link succeeded.  Wake up prior copy via pushback to
            'the DDE source, then unload Form1 and terminate.
            .LinkExecute "Wake up!"
            Unload Form1
        Else
            On Error GoTo 0
            'Link failed, so we're 1st.  Show Form1.
            Form1.Show vbModal
        End If
    End With
End Sub


Answer 2:

一般情况下,用于创建单实例应用程序的策略是添加一些代码来确定一个实例是否已经在运行的应用程序的初始化。 如果一个人,它得到一个句柄它的主窗口,通过重点吧,默默死去。 如果一个人则不然,它会继续运行并完成初始化序列照常休息。

你会发现很多是通过所有顶层窗口的迭代,寻找一个其标题匹配你所期望的一个完成这个老VB 6篇。 但是,这是一个非常脆弱的解决方案,它并不需要非常多把它扔了。

同样处理与App.PrevInstance财产 。 这是非常简单易用,而且在它的实现非常简单。 它的工作原理基础上的可执行文件的名称和查找正在运行的进程,其名称匹配。 但是,如果用户创建和重命名该可执行文件的副本,这是很容易被击败。 如果这是你可以接受的,你可以通过查询很容易实现这个App.PrevInstance属性。 否则,你需要使用更强大的解决方案。

这样的一个可能性是创建并注册了一个名为互斥体,当你的应用程序的第一个实例正在启动。 然后,当后续实例尝试注册相同的互斥体,他们会失败,这表明一个实例已在运行。 您可以找到有关答案使用互斥在VB 6说明这个问题 。

一对夫妇的使用互斥重要的注意事项:

  • 你需要确保你调用ReleaseMutexCloseHandle功能,当你的应用程序,以便释放的所有权和销毁所创建的互斥体被关闭。

  • 当你在VB 6 IDE中运行您的程序(例如,调试它),它会注册一个互斥体,互斥属于IDE,并不会被释放,直到你关闭IDE,并重新启动它。 为了防止这种情况,你可以使用条件编译的IDE /调试器中运行时,抑制互斥的创建。 如果采取这种方法,请一定要测试调试器之外的程序,以确保互斥相关功能正在按预期! 你不应该附带的东西,你有没有彻底的测试客户。

您可以通过使用随附VB 6安装捆绑API的浏览器程序找到所有的VB 6声明这些Windows API函数的。

有关处理一个VB 6应用程序的多个实例的详细信息,请点击这里卡尔彼得森的网站 。 还有一个完整的示例实现这篇文章VB加速器专门在步骤2 -focus,你不需要的代码的其余部分。



文章来源: Return to an already open application when a user tries to open a new instance in vb6
标签: vb6