打开“已知文件类型”到自定义应用程序的运行实例 – .NET
你如何打开一个文件(在注册表中有一个已知的文件/应用程序关联)到它应该打开的应用程序的“运行实例”? 一个例子是,我打开Excel并点击一个XLS文件…..该文件在当前的Excel实例中打开。 我想为自定义应用程序执行此操作…事件/消息传递如何“告诉”当前实例需要打开文件? 是否有“文件观察者”寻找请求这样做? 谢谢..
您要做的是从WindowsFormsApplicationBaseinheritance一个类,将受保护的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. // Create the application base. MyWindowsApplicationBase appBase = new MyWindowsApplicationBase(); // <1> Set the StartupNextInstance event handler. appBase.StartupNextInstance = ; // Show the main form of the app. appBase.Run(args); }
请注意标记为<1>的部分。 您可以使用StartupNextInstanceEvent的事件处理程序进行设置。 当您拥有单个实例应用程序(在MyWindowsApplicationBase的构造函数中指定)时,会触发下一个应用程序实例时触发此事件。 事件处理程序将传递一个EventArgs派生类,该类将具有命令行参数,然后您可以在应用程序的运行实例中处理这些参数。
然后,您所要做的就是为您希望应用程序处理的文件类型正常设置文件关联,然后进行设置。
看起来您正在寻找的是创建单个实例应用程序。 这可以通过使用位于Microsoft.VisualBasic.dll中的WindowsFormsApplicationBase在C#中完成
有关详细信息,请查看: http : //www.hanselman.com/blog/TheWeeklySourceCode31SingleInstanceWinFormsAndMicrosoftVisualBasicdll.aspx或搜索WindowsFormsApplicationBase
我这样做的方式是这样的:
- 在main方法的第一件事,检查应用程序的现有实例的进程列表。
- 如果找到,请使用您喜欢的进程间通信方法( 发送Windows消息 ,远程处理,wcf等)将文件名/路径发送到已在运行的实例
- 关闭Windows尝试启动的新进程(因为现有实例已处理文件打开操作
Windows使用DDE来实现此目的。
动态数据交换(DDE)是一种用于在Microsoft Windows或OS / 2下的多个应用程序之间进行通信的技术。
word或office文件的注册表关联除了通常的文件关联之外通常还有DDE命令(如果应用程序已在运行,则执行)。
因此,您可以在C#应用程序中托管DDE服务器以实现此function。
使用TCP套接字的示例: http : //pieterjan.pro/?a = Projecten_csharp_DrawIt.php
- 在窗体上启动TCPListener
- 在第二个实例的主要连接TCPClient
- 通过TCP连接发送ActivationArguments到表单
同时适用于多个文件,甚至第一次用于多个文件(当应用程序尚未启动时)
最重要的代码块是:
- MainForm(Hoofdscherm)的构造函数,其中启动服务器并将端口号写入文件。 第一个文件也会打开。
- Main-function(Program.cs),其中第二个,第三个……实例在第一个实例中连接到TcpListener并通过套接字发送文件名
源代码可在“Broncode”按钮上找到