Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用文件关联执行已启动应用程序的事件?_C#_.net_Windows_File Extension_File Association - Fatal编程技术网

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

C# 如何使用文件关联执行已启动应用程序的事件?,c#,.net,windows,file-extension,file-association,C#,.net,Windows,File Extension,File Association,在玩了一个新的Windows窗体项目之后,我发现当您将文件类型与Windows中的可执行文件相关联时,您可以使用args[0]从static void Main(string[]args) 如果应用程序已打开,双击文件时是否可以在应用程序上启动事件?(显然,Main(字符串[]args)不会被触发) 我尝试复制的应用程序行为示例: 用户打开GIMP(在Windows中) 用户打开资源管理器并右键单击.png文件 用户选择使用GIMP打开 GIMP没有创建新的GIMP应用程序实例,而是在已经打开的

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

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

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

  • 用户打开GIMP(在Windows中)
  • 用户打开资源管理器并右键单击.png文件
  • 用户选择使用GIMP打开
  • GIMP没有创建新的GIMP应用程序实例,而是在已经打开的GIMP实例内的新窗口中打开图片
  • 在这种情况下,GIMP是否使用多个应用程序接受与文件关联的“打开”文件?或者,是否可以使用单个应用程序“实例”执行此操作


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

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

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

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

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

    请参阅下面的文章,了解C#中的一个简单示例:


    雷蒙德当然是对的,但如果您正在寻求选项(1)实施方面的帮助,您可能应该查看和

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

    在对先前相关问题的回答中,有三种基本解决方案

  • 用于向第一个实例发送消息。这将使用
    HWND\u广播
    ,这可能会产生意想不到的后果

  • 当然,使用VisualBasic会让一些C#dev感到恐惧

  • 使用依赖于Windows名称的


  • 同样值得注意的是,如果您希望现有的应用程序位于前端,您需要特别小心,因为设置前台只能被放弃,而不能被接受。请参见和

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

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