c# - 单实例 Windows 窗体应用程序以及如何获取对它的引用?

标签 c# winforms singleton mutex

我有一个 Windows 窗体应用程序,它一次只允许一个实例运行。我已经通过使用 Mutex 实现了 Singleton。应用程序必须可以从命令行启动(带或不带参数)。应用程序由脚本启动和退出。用户不能对其执行任何操作。

因此,应用程序的目的是简单的“指示器”应用程序,它只会为最终用户显示一些视觉和图形信息。最终用户不能用它做任何事情,只能看到它。它是 Windows 窗体应用程序,因为这样视觉和图形外观相对容易实现(您可以将其设置为最顶层、无边框等)。

简单来说: 当有人尝试使用 exit 命令行参数运行相同的应用程序时,我该如何退出当前正在运行的应用程序?

bool quit = (args.Length > 0 && args[0] == "quit") ? true : false;
using (Mutex mutex = new Mutex(false, sExeName))
{
    if (!mutex.WaitOne(0, true)) 
    {
        if (quit)
        {
            // This is the tricky part?
            // How can I get reference to "previous" launced 
            // Windows Forms application and call it's Exit() method.
        }
    } 
    else 
    {
        if (!quit)
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

最佳答案

.NET 框架为此提供了一个非常好的通用解决方案。检查此 MSDN magazine article 的底部.使用 StartupNextInstanceHandler() 事件处理程序将任意命令传递给正在运行的实例,例如“退出”。

关于c# - 单实例 Windows 窗体应用程序以及如何获取对它的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/697058/

相关文章:

c++ - 在运行时反复使用和对象的最佳实践是什么

c# - [Location1].DistanceTo[Location2] 中的单位

C# 使用 ICC 配置文件将 RGB 值转换为 CMYK?

c# - 如何从 HTML 页面中提取一个或多个单词 C#

c# - 在 CloseReason.UserClosing 表单上显示关闭对话框 2 次

firebase - Firestore.getInstance() : how to use?

objective-c - 是否可以在静态库中使用 FlurryAPI?

c# - 如何确定 View 模型中的引用类型属性已更改?

c# - 为什么 C# 允许通过可选参数进行不明确的函数调用?

c# - VS2010 设计器 Z 顺序