【发布时间】:2009-01-08 14:16:19
【问题描述】:
您如何将文件(在注册表中具有已知的文件/应用程序关联)打开到应该打开的应用程序的“运行实例”中?一个例子是,我打开了 Excel,然后单击了一个 XLS 文件.....该文件在当前 Excel 实例中打开。我想为自定义应用程序执行此操作......事件/消息传递如何“告诉”当前实例它需要打开文件?是否有一个“文件观察者”来寻找这样做的请求等?谢谢。。
【问题讨论】:
您如何将文件(在注册表中具有已知的文件/应用程序关联)打开到应该打开的应用程序的“运行实例”中?一个例子是,我打开了 Excel,然后单击了一个 XLS 文件.....该文件在当前 Excel 实例中打开。我想为自定义应用程序执行此操作......事件/消息传递如何“告诉”当前实例它需要打开文件?是否有一个“文件观察者”来寻找这样做的请求等?谢谢。。
【问题讨论】:
您要做的是从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();
}
}
您的应用程序的 Main 方法如下所示:
// 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);
}
注意标记为 的部分。您使用StartupNextInstanceEvent 的事件处理程序进行设置。当您有一个单实例应用程序(您在 MyWindowsApplicationBase 的构造函数中指定)时,当您的应用程序的 next 实例被触发时,将触发此事件。事件处理程序将传递一个 EventArgs 派生类,该类将具有命令行参数,然后您可以在应用程序的运行实例中处理这些参数。
然后,您所要做的就是为您希望您的应用处理的文件类型正常设置文件关联,然后您就设置好了。
【讨论】:
看起来您正在寻找的是创建单实例应用程序。这可以通过使用位于 Microsoft.VisualBasic.dll 中的 WindowsFormsApplicationBase 在 C# 中完成
详情请看:
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 服务器来实现此功能。
【讨论】: