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

本文关键字:启动 应用程序 事件 关联 何执 行带 文件 | 更新日期: 2023-09-27 18:11:25

在尝试了一个新的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用户(即。

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

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

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

考虑到你的约束条件,选项(1)似乎是最好的选择。

Raymond当然是对的,但是如果您正在寻找实现选项(1)的帮助,您可能应该看看创建单实例应用程序的正确方法是什么?和。net 4的单个应用程序实例,并切换到相同应用程序的其他实例

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

在前面的链接问题的答案中有三个基本的解决方案

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

  2. 使用Microsoft.VisualBasic.ApplicationServices.ApplicationBase当然,对VisualBasic的引用会让一些c#开发人员感到不安。

  3. 使用FindWindow依赖于Windows名称

同样值得注意的是,如果你想让现有的应用程序在前面,你需要特别小心,因为设置前景只能被放弃而不能被占用。前台激活权限就像爱情:你不能偷它,它必须给你AllowSetForegroundWindow和SetForegroundWindow

微软为Visual basic.net创建了这个功能,c#也可以使用它。

请参阅下面的文章中的一个简单的c#示例:

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

这种方法最适合我:强制使用单实例WPF应用程序。特别是,它传递参数的解决方案也适用于只有通知图标的应用程序。