Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Winforms中带有外部命令行参数的SingleInstanceApp_C#_.net_Wpf_Winforms - Fatal编程技术网

C# Winforms中带有外部命令行参数的SingleInstanceApp

C# Winforms中带有外部命令行参数的SingleInstanceApp,c#,.net,wpf,winforms,C#,.net,Wpf,Winforms,我熟悉WPF应用程序,但对Winforms完全陌生 目标是创建一个单实例Winforms应用程序。如果实例化了另一个实例,它应该使用相应的命令args通知主实例,该命令args将调用主实例上的操作。下面是将在WPF上工作的示例 我已经在WPF中使用实现了相同的功能。但是,当我试图在Winforms中使用相同的功能时,我无法解决以下问题 应用程序Winforms中缺少实例 应用程序。缺少将用于调用主实例的当前 winforms中是否有任何等价物,或以任何其他方式实现winforms中的类似功能

我熟悉WPF应用程序,但对Winforms完全陌生

目标是创建一个单实例Winforms应用程序。如果实例化了另一个实例,它应该使用相应的命令args通知主实例,该命令args将调用主实例上的操作。下面是将在WPF上工作的示例

我已经在WPF中使用实现了相同的功能。但是,当我试图在Winforms中使用相同的功能时,我无法解决以下问题

  • 应用程序
    Winforms中缺少实例
  • 应用程序。缺少将用于调用主实例的当前
winforms中是否有任何等价物,或以任何其他方式实现winforms中的类似功能。

MSDN文档:

简短操作
  • 在应用程序启动时,创建/打开具有唯一名称的互斥体(其作用域为global/system)
var mutex=new mutex(false,“我最棒的单实例项目”);

  • 检查互斥锁是否已被占用/控制
var isMutexControlled=mutex.WaitOne(0,false);

  • 如果它已被控制,请退出应用程序
要获得更深入的社区知识,请查看以下答案,它提供了一种创建互斥锁的强大方法:

奖金问答 问:为什么Application或Application.Current不可用或为空


答:这是一种仅在WPF库中找到的方法,而在Windows窗体库中找不到。它们是构建可视化应用程序的独立框架(虽然它们可以组合,但我们不要陷入兔子洞)。

您可以使用如下全局互斥:

或者使用Windows事件,如下面的回答:

方法是使用
互斥锁来检测实例是否已在运行。要与第一个实例通信,可以使用IPC(进程间通信)。以下是代码:

static class Program
{
    const string AppId = "Local\\1DDFB948-19F1-417C-903D-BE05335DB8A4"; // Unique par application 

    [STAThread]
    static void Main(string[] args)
    {
        using (var mutex = new Mutex(false, AppId))
        {
            if (!mutex.WaitOne(0))
            {
                // 2nd instance
                // Send the command line to the first instance
                IpcChannel clientChannel = new IpcChannel();
                ChannelServices.RegisterChannel(clientChannel, false);
                SingleInstance app = (SingleInstance)Activator.GetObject(typeof(SingleInstance), string.Format("ipc://{0}/RemotingServer", AppId));
                app.Execute(args);
                return;
            }

            // 1st instance

            // Register the IPC server
            IpcChannel channel = new IpcChannel(AppId);
            ChannelServices.RegisterChannel(channel, false);
            RemotingConfiguration.RegisterWellKnownServiceType(typeof(SingleInstance), "RemotingServer", WellKnownObjectMode.Singleton);

            // Start the application
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }

    private class SingleInstance : MarshalByRefObject
    {
        public void Execute(string[] args)
        {
            // TODO use the args sent by the second instance
        }
    }
}

请参考:寻找完美答案!非常感谢…真的帮助了我。