【问题标题】:How to prevent the Form from opening Multiple Times如何防止表单多次打开
【发布时间】:2010-10-13 07:52:00
【问题描述】:

我有一个应用程序,其中有几种形式。在这些表格中,我有一个系统设置表格。我必须从菜单以及在桌面上创建的快捷方式打开此表单。

我可以分别从 2 个地方打开表单。但问题是,它打开了同一表单的两个单独实例。这意味着,首先,我单击了菜单以打开表单。现在我的表单实例已创建并显示在屏幕上。但是每当我点击我的桌面图标时,它都会创建相同表单的另一个实例,而不是显示相同的表单。 .所以这意味着它显示了相同表单的两个实例。

但我只显示一种形式。我也尝试过并在网上搜索过。我没有找到任何信息。

谁能帮我解决这个问题。任何形式的建议都会对我很有帮助。

【问题讨论】:

  • 听起来您有 2 个应用程序正在运行,对吗?
  • 您提到的桌面图标是 Windows 桌面 - 如果是这样,您正在创建应用程序的全新实例。您是否希望您的应用程序被实例化一次?
  • 抱歉耽搁了,其实我的桌面快捷方式也是一个exe(Source),它会在目标exe中打开一个特定的窗体。如果我们在目标 exe 内部,那么我们可以使用互斥锁或单例只打开一个表单实例。但是由于请求来自另一个 exe,即 Source exe,这个互斥锁概念也不起作用。

标签: c# winforms forms


【解决方案1】:

您需要一个实例。此构造已在 .Net 框架中可用。只需查看来自 Hanselman 的 this post

注意:我知道这个类的命名空间是VisualBasic。但这不应该妨碍您在 C# 应用程序中使用它。它只是一个命名空间的名称。它对它的功能没有任何意义。 (微软把它命名为 Foo 更好。那样的话它会更受欢迎。)

【讨论】:

    【解决方案2】:

    在我看来,您需要一个互斥锁来控制在给定时间只有一个应用程序实例正在运行。

    详情请见http://iridescence.no/post/CreatingaSingleInstanceApplicationinC.aspx

    【讨论】:

      【解决方案3】:

      您必须实施某种锁定机制以仅允许程序的一个实例运行。我猜您的系统设置程序可以在程序启动时检查计算机上是否正在运行其他实例,如果是则终止,否则启动一个新实例。

      【讨论】:

        【解决方案4】:

        要再添加一个链接,这篇文章似乎涵盖了(我的理解)您正在尝试做的事情。

        http://dotnetperls.com/single-instance-windows-form

        【讨论】:

          【解决方案5】:

          我使用信号量概念来控制它。每当打开表单时,我都会在注册表中写入一个条目。表单关闭后,我将删除此条目。

          所以,每当我尝试打开表单时,它都会检查注册表项。基于此,它将打开表单。

          【讨论】:

            【解决方案6】:

            听起来您需要修改版的 Singleton 设计模式。尝试在内部调用表单构造函数的类中使用公共静态方法。然后正如有人建议的那样,使用计数器变量来跟踪该静态方法被调用的次数,从而为您提供一个指标,您可以使用它来确保在创建实例时只有所需的数量。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多