当用户尝试在 vb6 中打开新实例时返回到已打开的应用程序

2023-12-05

假设用户将我的 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(使用前将#替换为@)

当用户尝试在 vb6 中打开新实例时返回到已打开的应用程序 的相关文章

  • VB6 应用程序调用 .NET DLL OutOfMemory 异常

    我们有一个调用 NET DLL 的 VB6 应用程序 有时 在 VB6 应用程序运行很长时间并多次调用 NET 代码后 NET 方面会抛出 OutOfMemory 异常 即使计算机上有足够的可用内存 VB6 的内存空间也远未达到极限 NET
  • 在 VB6 中的打印机上进行 Unicode 打印

    我正在尝试在打印机 实际上是 PDFCreator 上打印 Unicode 中文 字符串 但我得到的只是字符的垂直打印 我用TextOutW函数导入自gdi32 dll TextOutW dest hDC x y StrConv szTex
  • 有没有办法在 Visual Basic 6.0 应用程序中添加全局错误处理程序?

    VB 6 0没有任何全局处理程序 为了捕获运行时错误 我们需要在每个我们认为可能发生错误的方法中添加一个处理程序 但是 仍然有一些地方可能被遗漏 所以 我们最终会遇到运行时错误 在应用程序的所有方法中添加错误处理程序 唯一的方法吗 不 无法
  • 如何将数组(在 VB6 中通过引用)传递给 C\C++ *.dll 子例程?

    我需要将一个空的变体数组传递给一个用 C 编写的 DLL 并且在所有 Windows 版本上都可用 并且 C 代码 我无法控制也无法编辑 将用它的一些返回值填充空的变体数组价值观 基本上 当我尝试这样做时 ByRef 数组在应包含函数 子调
  • Visual Basic 6.0 中的无效限定符错误

    在 Visual Basic 6 0 程序中 我有一个字符串 sTemp 我想确保它不包含引号 我有这行 If sTemp Contains Then 但是当我在 sTemp 之后输入句点时 我没有从智能感知中得到任何信息 并且当我尝试编译
  • 如何将 char * 转换为 BSTR?

    如何将 char 从 C dll 传递到 VB 这是示例代码 void Cfunc char buffer int len BSTR buf bstr SysAllocString BSTR buffer VBptr VBfunc buf
  • 如何使用 java/vb 脚本调用自定义 ActiveX dll 中的方法

    我使用 VB6 创建了一个 ActiveX dll 并使用打包和部署向导将其打包 生成了一个 cab 文件和一个演示 HTML 页面 此 ActiveX dll 包含一个 simgle 方法 该方法返回字符串且不接受任何参数 我遇到的麻烦是
  • INTEGER 到 DATETIME 的转换与 VB6 不同

    我正在查看一些遗留的 VB6 代码 比我的时代早很多年 它对 SQL 2005 数据库运行查询 它提供了日期限制WHERE子句 其中日期作为整数值给出CLng VB6 中的日期 e g WHERE SomeDateField gt 4006
  • 寻找示例项目和“如何创建”VB6 Activex EXE

    我正在学习如何创建 VB6 Active X EXE 我需要为许多 VB6 应用程序添加 打电话回家 到服务器的功能 我想集中此功能 但不想使用 DLL 来实现 因为我只想需要防火墙权限one程序 phone home ActiveX EX
  • 从命令行编译 VB6

    有人知道如何从命令行编译 vb6 webclass dll 吗 我正在尝试构建一个用于自动版本构建的工具 但它失败并显示 文件 文件名 中的编译错误 第 xxxx 行 变量未定义 警报 已知错误 http support microsoft
  • 具有多个图像列表和图标/图像的列表视图

    我需要一种在列表视图上使用两个图像列表的方法 其中一个图像列表用于包含 16x16 图标的标题图标 另一个图像列表将在子项目中包含 32x32 缩略图 下图显示了我正在尝试做什么 我找到了解决这个问题的技巧 诀窍是在 32x32 画布上创建
  • 在 VB6 中使用 Crystal Reports 时出现错误 20728-F

    我在 VB6 项目中使用 Crystal Reports 但在加载报表时遇到错误crystalreport1 action 1 请给我一些解决这个问题的方法 它显示错误为Error in 20728 F cryStockReport Rep
  • 我想在 VB6 程序中使用 VB.NET dll。是否可以?

    我在 VB6 程序中使用 VB NET dll 时遇到问题 我已经使用 GuidAttribute 创建了 dll 使用 RegAsm 创建了 tlb 并将其添加到我的 VB6 程序的引用中 问题是当我尝试使用 CreateObject 函
  • 如何在 VB6 中读取子进程的标准输出?

    在VB6中创建进程时 涉及this https stackoverflow com questions 570295 can i spawn a synchronous process in vb6 and retrieve its ret
  • 如何在 VB6 中创建自动完成组合框?

    是否可以使用VB6下默认的ComboBox控件使其成为智能ComboBox 我们假设这些值已填充到组合框中 例如 New Delhi New World New York 我们需要 ComboBox 响应一个默认事件 因此当用户写入 N 时
  • 为什么我的应用程序会触发另一个应用程序的安装程序?

    当使用旧版 VB6 应用程序并在该应用程序中打开某些特定表单时 会弹出属于 Microsoft Navision 安装在同一台计算机上 的 Windows Installer 如附图所示 每次都会发生这种情况 但仅限于这台机器 VB6应用程
  • VB 6源代码,语音文本是法语想要翻译成英语[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个可能对我有用的程序 但文档和所有工具提示均采用我无法阅读的语言 源代码是可用的 整个事情大约有 84 000 行代码 我的问题
  • 使用“save”方法更改 ado 对象的 xml 导出字段的精度

    我正在开发一个 VB6 应用程序 该应用程序使用 ADODB Recordset 对象通过 save 方法将数据转储到 xml 文件 如下所示 adoRecordset Save strDst adPersistXML 其中 strDst
  • 分发用 VB6 开发的 Visio 插件

    我有旧的 VB6 Addin Visio 源代码 可以在编译时生成 DLL 我需要将此 dll 分发给最终用户 但是当我在用户的 PC 上以管理员身份运行以下命令时 regsvr32 MyAddin dll 它抛出 The Module M
  • VB6/VBA 中对象清除/数组释放真的有必要吗(优点/缺点?)[重复]

    这个问题在这里已经有答案了 我从使用静态代码分析 特别是 Aivosto 的项目分析器 中学到了很多关于 VB 的知识 它检查的一件事是您是否清除了所有对象和数组 我以前只是盲目地这样做 因为PA这么说 但现在我对 VB 释放资源的方式有了

随机推荐