【问题标题】:How to execute an event of already launched application with file association?如何使用文件关联执行已启动应用程序的事件?
【发布时间】:2011-10-17 19:03:28
【问题描述】:

在玩了一个新的 Windows 窗体项目后,我发现当您将文件类型与 Windows 中的可执行文件相关联时,您可以从 static void Main(string[] args) 中找到使用 args[0] 启动应用程序的文件的文件路径

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

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

  1. 用户打开 GIMP(在 Windows 中)
  2. 用户打开资源管理器并右键单击 .png 文件
  3. 用户选择使用 GIMP 打开
  4. GIMP 不会创建新的 GIMP 应用程序实例,而是在已打开的 GIMP 实例内的新窗口中打开图片。

在这种情况下,GIMP 是否使用多个应用程序来接受通过文件关联“打开”的文件?或者是否可以使用单个应用程序“实例”来做到这一点。

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

【问题讨论】:

  • 尝试谷歌搜索单实例应用程序

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


【解决方案1】:

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

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

鉴于您的限制,选项 (1) 似乎是最佳选择。

【讨论】:

    【解决方案2】:

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

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

    之前链接的问题的答案中提供了三种基本解决方案

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

    2. 使用Microsoft.VisualBasic.ApplicationServices.ApplicationBase 当然,对VisualBasic 的引用会让一些C# 开发人员大吃一惊。

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

    还值得注意的是,如果您希望现有应用程序位于前面,则需要特别小心,因为设置前景只能放弃而不能采取。见Foreground activation permission is like love: You can't steal it, it has to be given to youAllowSetForegroundWindowSetForegroundWindow

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2012-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-12-08
          • 1970-01-01
          • 2010-10-18
          相关资源
          最近更新 更多