C# Winforms中带有外部命令行参数的SingleInstanceApp
我熟悉WPF应用程序,但对Winforms完全陌生 目标是创建一个单实例Winforms应用程序。如果实例化了另一个实例,它应该使用相应的命令args通知主实例,该命令args将调用主实例上的操作。下面是将在WPF上工作的示例 我已经在WPF中使用实现了相同的功能。但是,当我试图在Winforms中使用相同的功能时,我无法解决以下问题C# Winforms中带有外部命令行参数的SingleInstanceApp,c#,.net,wpf,winforms,C#,.net,Wpf,Winforms,我熟悉WPF应用程序,但对Winforms完全陌生 目标是创建一个单实例Winforms应用程序。如果实例化了另一个实例,它应该使用相应的命令args通知主实例,该命令args将调用主实例上的操作。下面是将在WPF上工作的示例 我已经在WPF中使用实现了相同的功能。但是,当我试图在Winforms中使用相同的功能时,我无法解决以下问题 应用程序Winforms中缺少实例 应用程序。缺少将用于调用主实例的当前 winforms中是否有任何等价物,或以任何其他方式实现winforms中的类似功能
Winforms中缺少实例应用程序
应用程序。缺少将用于调用主实例的当前
- 在应用程序启动时,创建/打开具有唯一名称的互斥体(其作用域为global/system)
var mutex=new mutex(false,“我最棒的单实例项目”);
- 检查互斥锁是否已被占用/控制
var isMutexControlled=mutex.WaitOne(0,false);
- 如果它已被控制,请退出应用程序
答:这是一种仅在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
}
}
}
请参考:寻找完美答案!非常感谢…真的帮助了我。