当用户尝试在 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中列出文件夹中指定类型的所有文件的任何函数

    我想知道是否有一些内置函数适用于下面描述的场景 输入是父文件夹的路径 该函数必须做的是 它应该列出该父文件夹内的所有 zip 文件 父文件夹可以包含任意数量的子文件夹 这同样适用于子文件夹 任何人都可以帮我解决这个问题吗 VB版不是路障 V
  • 从 VBScript 读取 DLL(或 VB6)文件

    我正在尝试使用 VBScript 访问 VBA 文件 或 DLL 中的函数 我有点力不从心 而且我通常不使用这两种语言 所以我会解释一下情况 以防有更好的解决方案 我有一个仪器 它有一个类似 VBScript 的内部窗口 它具有 VBScr
  • VB 6:一个窗体上可以有多少个控件?

    我知道命名控件的限制是 254 超出这个限制就必须使用控件数组 但看来我们也达到了数组的极限 知道绝对极限是多少吗 没有absolute限制 如果您在表单上放置了足够多的控件 最终将耗尽内存 我制作了一个测试应用程序 将命令按钮加载到控制数
  • 使用 GDI+ 创建的图像未显示在 VB6 LeadTools 中

    我们有使用 VB6 构建的遗留应用程序 这些应用程序正在使用引导工具 一切都很顺利 我们有另一个 NET 进程来优化图像 并做一些水印 并将其保存为 tiff 格式 这是 NET 代码的一瞥 using var bitmap new Bit
  • Visual Basic 6 ListView 的自动化支持

    I need to get value text of control via automation interface coding with C C I tried with UI Automation API https msdn m
  • VB6杀死定时器

    我使用 VB6 进行编程 因为我们使用的是遗留代码和硬件 外部电子设备 我的程序是围绕计时器构建的 我将在操作系统编程中使用任务 计时器一直运行 直到其工作完成 设置一个标志并启动另一个计时器 我想要一个监督计时器来控制其他计时器当计时器没
  • VB6 有什么好的 TDD 工具或资源吗?

    是的 我知道我已经落后于时代了 但是我这里有一个古老的 VB6 编辑器应用程序 我相信没有人会很快升级到 NET 它使用了几个第三方 DLL 工具 并且由于它仍然使用旧的 RichEdit 控件 我基本上可以仅用这个工具来创建我自己的 Bu
  • 系统错误 &H80004015 (-2147467243)。该类被配置为作为与调用者不同的安全 ID 运行

    当尝试使用 Visual Studio 6 0 调试 VB dll 时 出现以下错误 有谁能告诉我为此需要做什么吗 系统错误 H80004015 2147467243 该类被配置为作为 安全 ID 与呼叫者不同 我曾经也有过一样的问题 创建
  • VB6 解析器/词法分析器/脚本编写器

    我有一个 VB6 游戏 它运行得很好 但我一直在考虑创建一个脚本引擎的想法 我想我希望 VB6 为我读取纯文本脚本文件 然后 lex parse execute 它们 我有很好的编程经验 之前也搭建过一个简单的C编译器 以及一个LOGO模拟
  • 在 Eclipse IDE 上使用 VBA [重复]

    这个问题在这里已经有答案了 可能的重复 有没有便宜或免费的 VB6 编程 IDE https stackoverflow com questions 1766514 any cheap or free ides out there for
  • 从 VB6 和 C# 调用 DLL 给出的双精度结果略有不同

    我在 DLL 中有一个专有库 我没有代码 该库已在 VB6 中使用多年 我正在尝试将VB6代码升级到C 并希望使C 代码完全复制VB6的行为 当从每个环境调用时 我无法使 DLL 中完成的某些计算的双精度结果完全匹配 在 VB6 中 我有类
  • 如何使用 C# 从 Excel 工作表中删除 VB 代码?

    有谁知道怎么删除all使用 C 的 VB 代码形成 Excel 工作簿 这段代码不起作用 它删除第一个 最后一个 VBComponent 但在第二个VBComponent上引发ArgumentException VBProject proj
  • 添加 Windows Common Controls 6.0 时对象库未注册

    我正在尝试在 Windows 7 32 位计算机上安装 Visual Studio 6 操作系统安装是从裸机进行的 我按照提到的说明进行操作here http www fortypoundhead com showcontent asp a
  • Visual Basic 6.0 中的无效限定符错误

    在 Visual Basic 6 0 程序中 我有一个字符串 sTemp 我想确保它不包含引号 我有这行 If sTemp Contains Then 但是当我在 sTemp 之后输入句点时 我没有从智能感知中得到任何信息 并且当我尝试编译
  • 在 Matlab、VB6 和 VB.NET 程序之间发送消息的最简单方法

    我们正在将一套数据采集和分析例程从 VB6 程序升级为 VB NET VB6 和 Matlab 程序的混合体 我们希望保持系统模块化 单独的 EXE 以便我们可以轻松创建专门的独立分析程序 而无需不断升级大型应用程序 当所有程序都是用 VB
  • ActiveX 组件无法创建对象

    我收到错误 ActiveX 组件无法创建对象 实际上 我有业务逻辑所在的 VB6 DLL 并且我在 VB NET 应用程序中调用该 DLL 函数 所有 DLL 都依赖于其他 DLL 我从其中一个 DLL 中收到错误 有任何想法吗 通常该错误
  • 在 C# 中使用 VB6 字符串数组

    我有 旧的 VB6 代码 我想从 C 代码中使用它 这有点类似于这个问题 https stackoverflow com questions 23507416 passing string array from vb6 to c net 但
  • 如何将exe异常路由回VB6应用程序?

    我有一个 vb6 应用程序 它将调用 mencoder exe 它是 mplayer 的一部分 用于将某些文件转换为 flv 格式 每当我尝试转换这个 opendivx 文件时 我都会从 mencoder 收到这个奇怪的未处理异常问题 目前
  • 如何使用 VB6 调用 Windows shell 命令?

    究竟如何使用 VB6 才能像从命令行一样调用任何 Windows shell 命令 例如 一些微不足道的事情 echo foo 操作方法如下 Shell cmd echo foo vbNormalFocus
  • 运行 SomeActiveX.Exe /regserver 的 API 等效项

    我需要以编程方式注册 ActiveX exe 而 Shell SomeActiveX Exe regserver 是不够的 有人知道等效的 API 吗 您可以使用DLL注册服务器 http msdn microsoft com en us

随机推荐