假设用户将我的 Visual Basic 应用程序最小化到任务栏通知图标。现在我希望当用户打开一个新实例时,旧实例应该恢复。
通常,创建单实例应用程序的策略是在应用程序初始化中添加一些代码来确定实例是否已在运行。如果是,它会获取主窗口的句柄,将焦点传递给它,然后默默地死亡。如果不是,它将继续运行并照常完成初始化序列的其余部分。
您会发现许多旧的 VB 6 文章通过遍历所有顶级窗口来完成此操作,寻找其标题与您期望的标题相匹配的窗口。但这是一个非常脆弱的解决方案,不需要花太多时间就可以放弃它。
同样的处理App.PrevInstance财产。这使用起来非常简单,而且实现起来也非常简单。它根据可执行文件的名称工作,并查找名称匹配的正在运行的进程。但是,如果用户创建并重命名可执行文件的副本,则很容易失败。如果这对您来说是可以接受的,您可以通过查询来非常轻松地实现这一点App.PrevInstance
财产。否则,您将需要使用更强大的解决方案。
其中一种可能性是在应用程序的第一个实例启动时创建并注册一个命名互斥体。然后,当后续实例尝试注册相同的互斥体时,它们将失败,表明实例已经在运行。您可以在 VB 6 的答案中找到有关使用互斥锁的说明这个问题.
使用互斥体的几个重要注意事项:
您需要确保您致电ReleaseMutex and CloseHandle当您的应用程序关闭时起作用,以释放您创建的互斥体的所有权并销毁它。
当您在 VB 6 IDE 中运行程序(例如,调试它)并且它注册了一个互斥体时,该互斥体属于 IDE,并且在您关闭 IDE 并重新启动之前不会被释放。为了防止这种情况,您可以使用条件编译在 IDE/调试器内部运行时抑制互斥体的创建。如果您采用这种方法,请务必测试您的程序outside调试器的操作,以确保与互斥体相关的功能按预期工作!您永远不应该向客户发送未经彻底测试的产品。
您可以使用 VB 6 安装附带的 API Viewer 程序找到这些 Windows API 函数的所有 VB 6 声明。
提供了有关处理 VB 6 应用程序的多个实例的更多信息在卡尔·彼得森的网站上。还有一个完整的示例实现这篇关于 VB 加速器的文章—特别关注第 2 步,您不需要其余的代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)