你需要继承一个来自 WindowsFormsApplicationBase 的类,并将保护的 IsSingleInstance 属性设置为 true:
// This should all be refactored to make it less tightly-coupled, obviously.
class MyWindowsApplicationBase : WindowsFormsApplicationBase
{
internal MyWindowsApplicationBase() : base()
{
// This is a single instance application.
this.IsSingleInstance = true;
// Set to the instance of your form to run.
this.MainForm = new MyForm();
}
}
你的应用程序的主方法应该像这样:
// This should all be refactored to make it less tightly-coupled, obviously.
public static void Main(string args[])
{
// Process the args.
<process args here>
// Create the application base.
MyWindowsApplicationBase appBase = new MyWindowsApplicationBase();
// <1> Set the StartupNextInstance event handler.
appBase.StartupNextInstance = <event handler code>;
// Show the main form of the app.
appBase.Run(args);
}
注意标记为<1>的部分。你需要为StartupNextInstanceEvent设置事件处理程序来完成此操作。当你有一个单实例应用程序(在MyWindowsApplicationBase的构造函数中指定)并且启动下一个应用程序实例时,该事件将被触发。事件处理程序会传递一个派生自EventArgs的类,其中包含命令行参数,然后您可以在运行实例中处理它们。
接下来,您只需正常设置文件关联,以处理您希望应用程序处理的文件类型,然后您就完成了。
看起来你需要创建一个单实例应用程序。在C#中,可以使用位于Microsoft.VisualBasic.dll中的WindowsFormsApplicationBase来完成此操作。
详细信息,请参见:
http://www.hanselman.com/blog/TheWeeklySourceCode31SingleInstanceWinFormsAndMicrosoftVisualBasicdll.aspx
或搜索WindowsFormsApplicationBase
使用TCP套接字的示例: http://pieterjan.pro/?a=Projecten_csharp_DrawIt.php
同样适用于同时处理多个文件,甚至在应用程序尚未启动时也可以处理多个文件。
最重要的代码块是:
源代码可在“Broncode”按钮上找到。
Windows使用DDE来实现此目的。
动态数据交换(DDE)是一种在Microsoft Windows或OS/2下多个应用程序之间进行通信的技术。
Word或Office文件的注册表关联通常除了常规文件关联外,还有DDE命令(如果应用程序已经在运行,则执行该命令)。
因此,您可以在C#应用程序中托管一个DDE服务器来实现此功能。