如何使用文件关联执行已启动的应用程序的事件?

时间:2011-10-17 19:03:28

标签: c# .net windows file-extension file-association

在使用新的Windows窗体项目后,我发现当您将文件类型与Windows中的可执行文件关联时,您可以使用args[0]从{{找到启动应用程序的文件的文件路径1}}

如果您的应用程序已经打开,双击文件时是否可以在您的应用程序上启动事件? (显然static void Main(string[] args)不会被触发)。

我尝试复制的具有行为的应用程序示例:

  1. 用户打开GIMP(在Windows中)
  2. 用户打开资源管理器并右键单击.png文件
  3. 用户选择使用GIMP打开
  4. GIMP不是创建GIMP的新应用程序实例,而是在已经打开的GIMP实例的新窗口中打开图片。
  5. 在这种情况下,GIMP是否使用多个应用程序接受文件关联“打开”的文件?或者是否可以使用单个应用程序“实例”来完成它。

    我遇到了麻烦,因为我的大多数搜索都倾向于引导我作为Windows用户进行文件关联(即“如何将.xls文件与excel关联”文章)。

4 个答案:

答案 0 :(得分:4)

有多种选择,但没有一种是免费的。

  1. 您的程序Main()可以检测到还有另一个副本已经运行,并通过您确定的某种方式将文件名移交给已经运行的副本。
  2. 您的程序可以注册为DDE服务器,并请求通过DDE执行后续打开。这是一种从1990年代开始的老式技术,通常不推荐用于新程序。
  3. 您可以为应用程序注册自定义放置目标,并让放置目标将文件名移交给已在运行的副本。此机制采用shell扩展的形式,因此由于CLR注入问题而不适合C#。
  4. 鉴于您的约束,选项(1)似乎是最佳选择。

答案 1 :(得分:2)

Raymond当然是对的,但是如果你正在寻找有关选项(1)实施的帮助,你应该看看What is the correct way to create a single instance application?.NET 4 single application instance以及Switch to other instance of same application

您会注意到检测应用程序非常简单(使用互斥锁)。引入其他应用程序并向其发送文件名可能更具挑战性。

以前关联的问题的答案中提出了三种基本解决方案

  1. 使用PostMessage向第一个实例发送消息。这使用HWND_BROADCAST,可能会产生意想不到的后果。

  2. 使用Microsoft.VisualBasic.ApplicationServices.ApplicationBase当然,对 VisualBasic 的引用会为一些C#开发人员提供帮助。

  3. 使用依赖于Windows名称的FindWindow

  4. 还值得注意的是,如果您希望现有应用程序位于前端,则需要特别小心,因为设置前景只能在不使用的情况下放弃。请参阅Foreground activation permission is like love: You can't steal it, it has to be given to youAllowSetForegroundWindow以及SetForegroundWindow

答案 2 :(得分:0)

Microsoft为Visual Basic .Net创建了此功能,它也可以被C#使用。

有关C#中的简单示例,请参阅以下帖子:

http://www.openwinforms.com/single_instance_application.html

答案 3 :(得分:0)

这种方法最适合我:Enforcing Single Instance WPF Applications。 特别是,它的传递参数的解决方案也适用于仅通知图标的应用程序。